1 import Base 2 import decode_frame.bend as F 3 import ordinary_declaration.bend as Identity 4 import persistence_declaration.bend as Decl 5 import decode_data.bend as D 6 import capabilities.bend as Cap 7 8 type Output is Type: 9 Replaced{canonical:D.Raw} 10 Refused{owner:R,error:D.Error} 11 def replaced(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~identity:Identity.Declaration,~project:P -> P & D.Raw,canonical:D.Raw,result:F.Frame & Unit) -> F.Frame & Output: 12 match result: 13 case (frame,_):(frame,Replaced{canonical}) 14 def checked(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~identity:Identity.Declaration,~project:P -> P & D.Raw,frame:F.Frame,receipt:D.Receipt) -> F.Frame & Output: 15 match receipt: 16 case D.Receipt{owner,D.Rejected{error}}:(frame,Refused{owner,error}) 17 case D.Receipt{owner,D.Accepted{canonical}}:replaced(~S,~C,~R,~E,~P,~Q,~identity,~project,canonical,F.resource_set(~S,~C,~R,~E,~P,~Q,~identity,~project,frame,owner)) 18 def request(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~identity:Identity.Declaration,~project:P -> P & D.Raw,~resource_identity:Identity.Declaration,~resource_project:R -> R & D.Raw,declaration:Decl.Constructed,frame:F.Frame,replacement:R) -> F.Frame & Output: 19 checked(~S,~C,~R,~E,~P,~Q,~identity,~project,frame,Decl.validate(~S,~R,~resource_identity,~resource_project,declaration,replacement)) 20 def grant(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~identity:Identity.Declaration,~project:P -> P & D.Raw,~resource_identity:Identity.Declaration,~resource_project:R -> R & D.Raw,~declaration:Decl.Constructed) -> Cap.OwnedRequest,R,Output>: 21 Cap.OwnedRequest{frame => replacement => request(~S,~C,~R,~E,~P,~Q,~identity,~project,~resource_identity,~resource_project,declaration,frame,replacement)}