decode_declaration.bend
bendvy-ecs-core@0.1.0.0 · 45 lines · 0 definitions
1import Base
2import bendvy-ecs-core@0.1.0.0/decode_frame.bend as F
3import bendvy-ecs-core@0.1.0.0/decode_owned_component.bend as OwnedWrite
4import bendvy-ecs-core@0.1.0.0/decode_requests.bend as Request
5import bendvy-ecs-core@0.1.0.0/world.bend as W
6import bendvy-ecs-core@0.1.0.0/column.bend as Col
7import bendvy-ecs-core@0.1.0.0/component.bend as Cmp
8import bendvy-ecs-core@0.1.0.0/compose.bend as Query
9import bendvy-ecs-core@0.1.0.0/capabilities.bend as Cap
10import bendvy-ecs-core@0.1.0.0/bundle_install.bend as Install
11import bendvy-ecs-core@0.1.0.0/ordinary_declaration.bend as Identity
12import bendvy-ecs-core@0.1.0.0/decode_data.bend as D
13import bendvy-ecs-core@0.1.0.0/ordinary_query_declaration.bend as Clause
14
15type Ops<S:Data,P:Type,R:Type,V:Data,-H:Type> is Type:
16 Ops{read:Cap.Read<H,V>,write:Cap.OwnedRequest<H,Query.Insert<S,P>,OwnedWrite.Output<P>>,spawn:Cap.OwnedRequest<H,P,Request.Output<S,P>>,decode:Cap.OwnedRequest<H,Request.Input<S,P>,Request.Output<S,P>>,resource:Cap.OwnedRequest<H,R,Unit>}
17# One ordinary query write clause supplies nominal identity, read provider,
18# membership and metadata. The owned setter uses the identical family/lenses.
19def query(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration<S,P>,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~install:W.World<S,Store,R,E> -> W.Handle<S> -> Request.Packet<P> -> Install.Attempt<W.World<S,Store,R,E>,Request.Packet<P>,Q>) -> Clause.Declaration<S,Query.Frame<S,Store,R,E>,Cap.Write<Query.Frame<S,Store,R,E>,P,V>>:
20 Clause.write(~S,~P,~Store,~R,~E,~Rest,~V,~Token,~identity,~view,~take,~put)
21
22def read_grant(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration<S,P>,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~install:W.World<S,Store,R,E> -> W.Handle<S> -> Request.Packet<P> -> Install.Attempt<W.World<S,Store,R,E>,Request.Packet<P>,Q>) -> Cap.Read<Query.Frame<S,Store,R,E>,V>:
23 Cap.Read{Cap.write_read_field(~Query.Frame<S,Store,R,E>,~P,~V,Clause.grant(~S,~Query.Frame<S,Store,R,E>,~Cap.Write<Query.Frame<S,Store,R,E>,P,V>,query(~S,~Store,~R,~E,~P,~Q,~V,~Rest,~Token,~identity,~project,~view,~take,~put,~install)))}
24
25def grants(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration<S,P>,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~install:W.World<S,Store,R,E> -> W.Handle<S> -> Request.Packet<P> -> Install.Attempt<W.World<S,Store,R,E>,Request.Packet<P>,Q>) -> Ops<S,P,R,V,F.Frame<S,Store,R,E,P,Q,identity,project>>:
26 Ops{F.read_grant(~S,~Store,~R,~E,~P,~Q,~V,~identity,~project,~read_grant(~S,~Store,~R,~E,~P,~Q,~V,~Rest,~Token,~identity,~project,~view,~take,~put,~install)),OwnedWrite.grant(~S,~Store,~R,~E,~P,~Q,~identity,~project,~Rest,~V,~Token,~take,~put,~view,~Cmp.Family{Identity.key(~S,~P,identity)}),F.spawn_grant(~S,~Store,~R,~E,~P,~Q,~identity,~project,~install),F.request_grant(~S,~Store,~R,~E,~P,~Q,~identity,~project),F.resource_grant(~S,~Store,~R,~E,~P,~Q,~identity,~project)}
27
28def invoke(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration<S,P>,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~install:W.World<S,Store,R,E> -> W.Handle<S> -> Request.Packet<P> -> Install.Attempt<W.World<S,Store,R,E>,Request.Packet<P>,Q>,~A:Type,~U:Type,~body:@-H:Type -> @-ops:Ops<S,P,R,V,H> -> A -> H -> H & U,frame:F.Frame<S,Store,R,E,P,Q,identity,project>,args:A) -> F.Frame<S,Store,R,E,P,Q,identity,project> & U:
29 Cap.invoke_owned(~(H => Ops<S,P,R,V,H>),~A,~U,~body,~F.Frame<S,Store,R,E,P,Q,identity,project>,~grants(~S,~Store,~R,~E,~P,~Q,~V,~Rest,~Token,~identity,~project,~view,~take,~put,~install),args,frame)
30
31def access_clauses(~S:Data,values:List<&2,Clause.Clause<S>>) -> List<&2,String>:
32 match values:
33 case []:[]
34 case Clause.Clause{name,_} <> rest:name <> access_clauses(~S,rest)
35
36def access(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration<S,P>,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~install:W.World<S,Store,R,E> -> W.Handle<S> -> Request.Packet<P> -> Install.Attempt<W.World<S,Store,R,E>,Request.Packet<P>,Q>,~resource:Identity.Declaration<S,R>) -> List<&2,String>:
37 List.append(&2,String,access_clauses(~S,Clause.clauses(~S,~Query.Frame<S,Store,R,E>,~Cap.Write<Query.Frame<S,Store,R,E>,P,V>,query(~S,~Store,~R,~E,~P,~Q,~V,~Rest,~Token,~identity,~project,~view,~take,~put,~install))),[Identity.key(~S,~R,resource)])
38
39# Read-only assembly grants no owned writer/spawn/resource capability.
40def readonly_query(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration<S,P>,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~install:W.World<S,Store,R,E> -> W.Handle<S> -> Request.Packet<P> -> Install.Attempt<W.World<S,Store,R,E>,Request.Packet<P>,Q>) -> Clause.Declaration<S,Query.Frame<S,Store,R,E>,Cap.Read<Query.Frame<S,Store,R,E>,V>>:
41 Clause.read(~S,~P,~Store,~R,~E,~Rest,~V,~Token,~identity,~view,~take,~put)
42def readonly_grant(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration<S,P>,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~install:W.World<S,Store,R,E> -> W.Handle<S> -> Request.Packet<P> -> Install.Attempt<W.World<S,Store,R,E>,Request.Packet<P>,Q>) -> Cap.Read<F.Frame<S,Store,R,E,P,Q,identity,project>,V>:
43 F.read_grant(~S,~Store,~R,~E,~P,~Q,~V,~identity,~project,~Clause.grant(~S,~Query.Frame<S,Store,R,E>,~Cap.Read<Query.Frame<S,Store,R,E>,V>,readonly_query(~S,~Store,~R,~E,~P,~Q,~V,~Rest,~Token,~identity,~project,~view,~take,~put,~install)))
44def invoke_readonly(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration<S,P>,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column<S,P>,~put:Rest -> Col.Column<S,P> -> Store,~install:W.World<S,Store,R,E> -> W.Handle<S> -> Request.Packet<P> -> Install.Attempt<W.World<S,Store,R,E>,Request.Packet<P>,Q>,~A:Type,~U:Type,~body:@-H:Type -> @-cap:Cap.Read<H,V> -> A -> H -> H & U,frame:F.Frame<S,Store,R,E,P,Q,identity,project>,args:A) -> F.Frame<S,Store,R,E,P,Q,identity,project> & U:
45 Cap.invoke_owned(~(H => Cap.Read<H,V>),~A,~U,~body,~F.Frame<S,Store,R,E,P,Q,identity,project>,~readonly_grant(~S,~Store,~R,~E,~P,~Q,~V,~Rest,~Token,~identity,~project,~view,~take,~put,~install),args,frame)