1 import Base 2 import decode_construction.bend as Constructor 3 import decode_validated_resource.bend as Resource 4 import ordinary_declaration.bend as Identity 5 import decode_data.bend as D 6 import bundle_construction.bend as Build 7 import capabilities.bend as Cap 8 9 type Output is Type: 10 Replaced{canonical:D.Raw,undo:R -> I} 11 Refused{owner:I,error:D.Error} 12 def returned(~I:Type,~R:Type,~H:Type,undo:R -> I,result:H & Resource.Output) -> H & Output: 13 match result: 14 case (ctx,Resource.Replaced{canonical}):(ctx,Replaced{canonical,undo}) 15 case (ctx,Resource.Refused{owner,error}):(ctx,Refused{undo(owner),error}) 16 def constructed(~I:Type,~R:Type,~H:Type,~request:Cap.OwnedRequest>,ctx:H,value:Build.Construction) -> H & Output: 17 match value: 18 case Build.Invalid{owner,error}:(ctx,Refused{owner,error}) 19 case Build.Constructed{owner,undo}:returned(~I,~R,~H,undo,Cap.owned_request(~H,~R,~Resource.Output,~request,ctx,owner)) 20 def apply(~S:Data,~I:Type,~R:Type,~identity:Identity.Declaration,~project:R -> R & D.Raw,~incoming:I -> I & D.Raw,~build:I -> D.Raw -> Build.Construction,~factory:Constructor.Factory,~H:Type,~request:Cap.OwnedRequest>,ctx:H,input:I) -> H & Output: 21 constructed(~I,~R,~H,~request,ctx,Constructor.construct(~S,~I,~R,~identity,~project,~incoming,~build,factory,input)) 22 def grant(~S:Data,~I:Type,~R:Type,~identity:Identity.Declaration,~project:R -> R & D.Raw,~incoming:I -> I & D.Raw,~build:I -> D.Raw -> Build.Construction,~factory:Constructor.Factory,~H:Type,~request:Cap.OwnedRequest>) -> Cap.OwnedRequest>: 23 Cap.OwnedRequest{ctx => input => apply(~S,~I,~R,~identity,~project,~incoming,~build,~factory,~H,~request,ctx,input)}