1 import Base 2 import ./world.bend as W 3 import ./execution_composer_layout.bend as Layout 4 import ./execution_command_system.bend as Cmd 5 import ./execution_command_local.bend as Local 6 import ./execution_command_permission.bend as Permission 7 import ./execution_command_removed.bend as Removed 8 import ./execution_command_publication.bend as Publication 9 import ./execution_lifetime_scope_buffer.bend as LifetimeScope 10 import ./execution_system.bend as Sys 11 import ./execution_system_registration.bend as Registration 12 import ./execution_declaration.bend as D 13 import ./execution_deferred_settings.bend as Settings 14 import ./change_tick.bend as Tick 15 16 def command_world(~S:Data,~WC:Type,~WR:Type,~E:Data,~layout:Layout.Layout,same:{WC == Layout.columns(~S,layout) : Type},world:W.World) -> W.World: 17 %same : W.World 18 world 19 20 def published(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),~WR:Type,~same:{WC == Layout.columns(~S,layout) : Type},result:W.World & Cmd.Owner) -> W.World & Cmd.Owner: 21 %Equal.sym(Type,WC,Layout.columns(~S,layout),same) : W.World & Cmd.Owner 22 result 23 24 def pending_allowed(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),owner:Cmd.Owner,allowed:Bool) -> Cmd.Owner & Bool: 25 match allowed: 26 case False{}:(owner,False{}) 27 case True{}:Cmd.pending(~S,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,owner) 28 29 def pending_metadata(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),ids:List<&2,U32>,result:Cmd.Owner & Cmd.Metadata) -> Cmd.Owner & Bool: 30 match result: 31 case (owner,Cmd.Metadata{id,_,_}):pending_allowed(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,owner,Settings.member(id,ids)) 32 33 def pending_selected(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),ids:List<&2,U32>,owner:Cmd.Owner) -> Cmd.Owner & Bool: 34 pending_metadata(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,ids,Cmd.metadata(~S,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,owner)) 35 36 def pending_coherent(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),ids:List<&2,U32>,result:Cmd.Owner & Bool) -> Cmd.Owner & Bool: 37 match result: 38 case (owner,False{}):(owner,False{}) 39 case (owner,True{}):pending_selected(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,ids,owner) 40 41 def publish_interpreted(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),~WR:Type,~sameWR:{WR == Layout.resources(~S,resources) : Type},~relations:Permission.Relations,~selection:Permission.Selection,~scopeInterpreter:LifetimeScope.Interpreter(~S,~Layout.columns(~S,layout),~WR,~E,~Layout.payload(layout,route),~Removed.Removed(layout),~resources,~sameWR),~same:{WC == Layout.columns(~S,layout) : Type},~valid:{Layout.grant_valid(~layout,~route) == True{} : Bool},+checked:Cmd.CheckedPermission,ids:List<&2,U32>,tick:Tick.Tick,world:W.World,owner:Cmd.Owner) -> W.World & Cmd.Owner: 42 match owner: 43 case Cmd.Owner{Sys.Owner{namespace,+id,name,access,cursor,local}}:Cmd.publication_gate(W.World,Cmd.Owner,Settings.member(id,ids),world,Cmd.Owner{Sys.Owner{namespace,id,name,access,cursor,local}},actionWorld => actionOwner => published(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,~WR,~same,Cmd.publish_interpreted(~S,~C,~R,~E,~layout,~resources,~route,~valid,~Ops,~User,~Error,~Out,~declaration,~body,~WR,~sameWR,~relations,~selection,~scopeInterpreter,checked,tick,command_world(~S,~WC,~WR,~E,~layout,same,actionWorld),actionOwner))) 44 45 # Applicability is checked before the barrier advances the World clock. 46 47 def pending_wrapped(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),~WR:Type,world:W.World,result:Cmd.Owner & Bool) -> W.World & (Cmd.Owner & Bool): 48 (world,result) 49 50 def pending_verified(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),~WR:Type,+checked:Cmd.CheckedPermission,ids:List<&2,U32>,owner:Cmd.Owner,result:W.World & Bool) -> W.World & (Cmd.Owner & Bool): 51 match result: 52 case (world,False{}):(world,(owner,False{})) 53 case (world,True{}):pending_wrapped(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,~WR,world,pending_coherent(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,ids,Cmd.permission_matches(~S,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,checked,owner))) 54 55 def pending(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),~WR:Type,+checked:Cmd.CheckedPermission,ids:List<&2,U32>,world:W.World,owner:Cmd.Owner) -> W.World & (Cmd.Owner & Bool): 56 match owner: 57 case Cmd.Owner{Sys.Owner{+namespace,+id,+name,+access,+cursor,local}}:pending_verified(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,~WR,checked,ids,Cmd.Owner{Sys.Owner{namespace,id,name,access,cursor,local}},Registration.verify(~S,~WC,~WR,~E,~Cmd.System(~S,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body),Registration.Meta{namespace,id,name,access,cursor},world)) 58 59 def publish_with_compilation_interpreted(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),~WR:Type,~sameWR:{WR == Layout.resources(~S,resources) : Type},~relations:Permission.Relations,~selection:Permission.Selection,~scopeInterpreter:LifetimeScope.Interpreter(~S,~Layout.columns(~S,layout),~WR,~E,~Layout.payload(layout,route),~Removed.Removed(layout),~resources,~sameWR),~same:{WC == Layout.columns(~S,layout) : Type},~valid:{Layout.grant_valid(~layout,~route) == True{} : Bool},compilation:D.Compilation,ids:List<&2,U32>,tick:Tick.Tick,world:W.World,owner:Cmd.Owner) -> D.Compilation & (W.World & Cmd.Owner): 60 match compilation owner: 61 case D.Supported{D.Declaration{Permission.Prepared{+actualPermission,+actualRelations,actualSelection,actualOps},actualAccess},actualRecipes} Cmd.Owner{Sys.Owner{namespace,+id,name,access,cursor,local}}:(D.Supported{D.Declaration{Permission.Prepared{actualPermission,actualRelations,actualSelection,actualOps},actualAccess},actualRecipes},Cmd.publication_gate(W.World,Cmd.Owner,Settings.member(id,ids),world,Cmd.Owner{Sys.Owner{namespace,id,name,access,cursor,local}},actionWorld => actionOwner => published(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,~WR,~same,Cmd.publish_interpreted(~S,~C,~R,~E,~layout,~resources,~route,~valid,~Ops,~User,~Error,~Out,~declaration,~body,~WR,~sameWR,~relations,~selection,~scopeInterpreter,Cmd.ReadyPermission{actualPermission,actualRelations},tick,command_world(~S,~WC,~WR,~E,~layout,same,actionWorld),actionOwner)))) 62 case D.Unsupported{Permission.Prepared{+actualPermission,+actualRelations,actualSelection,actualOps},actualAccess,actualRecipes} Cmd.Owner{Sys.Owner{namespace,+id,name,access,cursor,local}}:(D.Unsupported{Permission.Prepared{actualPermission,actualRelations,actualSelection,actualOps},actualAccess,actualRecipes},Cmd.publication_gate(W.World,Cmd.Owner,Settings.member(id,ids),world,Cmd.Owner{Sys.Owner{namespace,id,name,access,cursor,local}},actionWorld => actionOwner => published(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,~WR,~same,Cmd.publish_interpreted(~S,~C,~R,~E,~layout,~resources,~route,~valid,~Ops,~User,~Error,~Out,~declaration,~body,~WR,~sameWR,~relations,~selection,~scopeInterpreter,Cmd.UnsupportedPermission{actualPermission,actualRelations},tick,command_world(~S,~WC,~WR,~E,~layout,same,actionWorld),actionOwner)))) 63 64 def pending_inspected(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),~WR:Type,ids:List<&2,U32>,world:W.World,owner:Cmd.Owner,observed:D.Compilation & Cmd.CheckedPermission) -> D.Compilation & (W.World & (Cmd.Owner & Bool)): 65 match observed: 66 case (compilation,checked):(compilation,pending(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,~WR,checked,ids,world,owner)) 67 68 def pending_with_compilation(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),~WR:Type,compilation:D.Compilation,ids:List<&2,U32>,world:W.World,owner:Cmd.Owner) -> D.Compilation & (W.World & (Cmd.Owner & Bool)): 69 pending_inspected(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,~WR,ids,world,owner,Cmd.inspect_permission(~S,~C,~R,~layout,~resources,~route,~Ops,compilation)) 70 71 def publish(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),~WR:Type,~sameWR:{WR == Layout.resources(~S,resources) : Type},~relations:Permission.Relations,~selection:Permission.Selection,~same:{WC == Layout.columns(~S,layout) : Type},~valid:{Layout.grant_valid(~layout,~route) == True{} : Bool},+checked:Cmd.CheckedPermission,ids:List<&2,U32>,tick:Tick.Tick,world:W.World,owner:Cmd.Owner) -> W.World & Cmd.Owner: 72 publish_interpreted(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,~WR,~sameWR,~relations,~selection,~LifetimeScope.apply(~S,~Layout.columns(~S,layout),~WR,~E,~Layout.payload(layout,route),~Removed.Removed(layout),~resources,~sameWR,~selection,~relations,~Publication.scope_dispose(~S,~WR,~E,~layout,~route)),~same,~valid,checked,ids,tick,world,owner) 73 74 def publish_with_compilation(~S:Data,~WC:Type,~C:Type,~R:Type,~E:Data,~layout:Layout.Layout,~resources:Layout.Layout,~route:Layout.Route,~Ops:Data -> (Type -> Type) -> Type -> Type -> Type,~User:Type,~Error:Data,~Out:Data,~declaration:Cmd.Program(~S,~C,~R,~layout,~resources,~route,~Ops),~body:Cmd.Body(~S,~layout,~resources,~route,~Ops,~User,~Error,~Out),~WR:Type,~sameWR:{WR == Layout.resources(~S,resources) : Type},~relations:Permission.Relations,~selection:Permission.Selection,~same:{WC == Layout.columns(~S,layout) : Type},~valid:{Layout.grant_valid(~layout,~route) == True{} : Bool},compilation:D.Compilation,ids:List<&2,U32>,tick:Tick.Tick,world:W.World,owner:Cmd.Owner) -> D.Compilation & (W.World & Cmd.Owner): 75 publish_with_compilation_interpreted(~S,~WC,~C,~R,~E,~layout,~resources,~route,~Ops,~User,~Error,~Out,~declaration,~body,~WR,~sameWR,~relations,~selection,~LifetimeScope.apply(~S,~Layout.columns(~S,layout),~WR,~E,~Layout.payload(layout,route),~Removed.Removed(layout),~resources,~sameWR,~selection,~relations,~Publication.scope_dispose(~S,~WR,~E,~layout,~route)),~same,~valid,compilation,ids,tick,world,owner)