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 Error is Data:Construction{error:Constructor.Error} Admission{error:D.Error} 10 type Output is Type: 11 Replaced{canonical:D.Raw,undo:R -> I} 12 Refused{owner:I,error:Error} 13 def returned(~I:Type,~R:Type,~Custom:Data,~H:Type,undo:R -> I,result:H & Resource.Output) -> H & Output: 14 match result: 15 case (ctx,Resource.Replaced{canonical}):(ctx,Replaced{canonical,undo}) 16 case (ctx,Resource.Refused{owner,error}):(ctx,Refused{undo(owner),Admission{error}}) 17 def constructed(~I:Type,~R:Type,~Custom:Data,~H:Type,~request:Cap.OwnedRequest>,ctx:H,value:Build.Construction>) -> H & Output: 18 match value: 19 case Build.Invalid{owner,error}:(ctx,Refused{owner,Construction{error}}) 20 case Build.Constructed{owner,undo}:returned(~I,~R,~Custom,~H,undo,Cap.owned_request(~H,~R,~Resource.Output,~request,ctx,owner)) 21 def apply(~S:Data,~I:Type,~R:Type,~Custom:Data,~identity:Identity.Declaration,~project:R -> R & D.Raw,~incoming:I -> I & D.Raw,~build:I -> D.Raw -> Build.Construction,~factory:Constructor.FallibleFactory,~H:Type,~request:Cap.OwnedRequest>,ctx:H,input:I) -> H & Output: 22 constructed(~I,~R,~Custom,~H,~request,ctx,Constructor.fallible_construct(~S,~I,~R,~Custom,~identity,~project,~incoming,~build,factory,input)) 23 def grant(~S:Data,~I:Type,~R:Type,~Custom:Data,~identity:Identity.Declaration,~project:R -> R & D.Raw,~incoming:I -> I & D.Raw,~build:I -> D.Raw -> Build.Construction,~factory:Constructor.FallibleFactory,~H:Type,~request:Cap.OwnedRequest>) -> Cap.OwnedRequest>: 24 Cap.OwnedRequest{ctx => input => apply(~S,~I,~R,~Custom,~identity,~project,~incoming,~build,~factory,~H,~request,ctx,input)}