1 import Base 2 import ./decode_frame.bend as F 3 import ./decode_owned_component.bend as OwnedWrite 4 import ./decode_requests.bend as Request 5 import ./world.bend as W 6 import ./column.bend as Col 7 import ./component.bend as Cmp 8 import ./compose.bend as Query 9 import ./capabilities.bend as Cap 10 import ./bundle_install.bend as Install 11 import ./ordinary_declaration.bend as Identity 12 import ./decode_data.bend as D 13 import ./ordinary_query_declaration.bend as Clause 14 15 type Ops is Type: 16 Ops{read:Cap.Read,write:Cap.OwnedRequest,OwnedWrite.Output

>,spawn:Cap.OwnedRequest>,decode:Cap.OwnedRequest,Request.Output>,resource:Cap.OwnedRequest} 17 # One ordinary query write clause supplies nominal identity, read provider, 18 # membership and metadata. The owned setter uses the identical family/lenses. 19 def query(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~install:W.World -> W.Handle -> Request.Packet

-> Install.Attempt,Request.Packet

,Q>) -> Clause.Declaration,Cap.Write,P,V>>: 20 Clause.write(~S,~P,~Store,~R,~E,~Rest,~V,~Token,~identity,~view,~take,~put) 21 22 def read_grant(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~install:W.World -> W.Handle -> Request.Packet

-> Install.Attempt,Request.Packet

,Q>) -> Cap.Read,V>: 23 Cap.Read{Cap.write_read_field(~Query.Frame,~P,~V,Clause.grant(~S,~Query.Frame,~Cap.Write,P,V>,query(~S,~Store,~R,~E,~P,~Q,~V,~Rest,~Token,~identity,~project,~view,~take,~put,~install)))} 24 25 def grants(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~install:W.World -> W.Handle -> Request.Packet

-> Install.Attempt,Request.Packet

,Q>) -> Ops>: 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 28 def invoke(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~install:W.World -> W.Handle -> Request.Packet

-> Install.Attempt,Request.Packet

,Q>,~A:Type,~U:Type,~body:@-H:Type -> @-ops:Ops -> A -> H -> H & U,frame:F.Frame,args:A) -> F.Frame & U: 29 Cap.invoke_owned(~(H => Ops),~A,~U,~body,~F.Frame,~grants(~S,~Store,~R,~E,~P,~Q,~V,~Rest,~Token,~identity,~project,~view,~take,~put,~install),args,frame) 30 31 def access_clauses(~S:Data,values:List<&2,Clause.Clause>) -> List<&2,String>: 32 match values: 33 case []:[] 34 case Clause.Clause{name,_} <> rest:name <> access_clauses(~S,rest) 35 36 def access(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~install:W.World -> W.Handle -> Request.Packet

-> Install.Attempt,Request.Packet

,Q>,~resource:Identity.Declaration) -> List<&2,String>: 37 List.append(&2,String,access_clauses(~S,Clause.clauses(~S,~Query.Frame,~Cap.Write,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. 40 def readonly_query(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~install:W.World -> W.Handle -> Request.Packet

-> Install.Attempt,Request.Packet

,Q>) -> Clause.Declaration,Cap.Read,V>>: 41 Clause.read(~S,~P,~Store,~R,~E,~Rest,~V,~Token,~identity,~view,~take,~put) 42 def readonly_grant(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~install:W.World -> W.Handle -> Request.Packet

-> Install.Attempt,Request.Packet

,Q>) -> Cap.Read,V>: 43 F.read_grant(~S,~Store,~R,~E,~P,~Q,~V,~identity,~project,~Clause.grant(~S,~Query.Frame,~Cap.Read,V>,readonly_query(~S,~Store,~R,~E,~P,~Q,~V,~Rest,~Token,~identity,~project,~view,~take,~put,~install))) 44 def invoke_readonly(~S:Data,~Store:Type,~R:Type,~E:Data,~P:Type,~Q:Type,~V:Data,~Rest:Type,~Token:Data,~identity:Identity.Declaration,~project:P -> P & D.Raw,~view:P -> P & V,~take:Store -> Rest & Col.Column,~put:Rest -> Col.Column -> Store,~install:W.World -> W.Handle -> Request.Packet

-> Install.Attempt,Request.Packet

,Q>,~A:Type,~U:Type,~body:@-H:Type -> @-cap:Cap.Read -> A -> H -> H & U,frame:F.Frame,args:A) -> F.Frame & U: 45 Cap.invoke_owned(~(H => Cap.Read),~A,~U,~body,~F.Frame,~readonly_grant(~S,~Store,~R,~E,~P,~Q,~V,~Rest,~Token,~identity,~project,~view,~take,~put,~install),args,frame)