1 import Base 2 import ./ordinary_optional_resource.bend as O 3 import ./optional_resource_binding.bend as B 4 import ./ordinary_schema.bend as Schema 5 import ./owner_product.bend as Product 6 import ./ordinary_resource_field_system.bend as Field 7 import ./ordinary_query_declaration.bend as Q 8 import ./world.bend as W 9 import ./resource.bend as Resource 10 import ./transaction.bend as T 11 import ./capabilities.bend as Cap 12 # One declaration carries actual operation, preflight and owner-return observer. 13 type Declaration<-S:Data,-C:Type,-R:Type,-E:Data,-Ops:Type -> Type,-V:Data> is Type: 14 Declaration{ordinary:Field.Declaration,E>,Ops(T.Tx,E>)>,required:W.World -> W.World & List<&2,String>,observe:W.World -> W.World & V,render:V -> String} 15 def Ops(~S:Data,~P:Type,~identity:Schema.Resource,~V:Data,H:Type) -> Type: 16 Field.Read> 17 def provided(~S:Data,~C:Type,~R:Type,~E:Data,world:W.World) -> W.World & List<&2,String>: 18 (world,[]) 19 def built(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~Rest:Type,~V:Data,~identity:Schema.Resource,~lens:Product.Lens,Rest>,~binding:B.Binding,~view:P -> P & V,required:W.World -> W.World & List<&2,String>,render:Maybe<&2,V> -> String) -> Declaration>: 20 Declaration{Field.Declaration{Field.Read{Cap.ValueRead{Resource.tx_get(~S,~C,~R,~E,~Maybe<&2,V>,~O.project(~S,~R,~P,~Rest,~V,~identity,~lens,~view))}},[Q.Clause{Schema.resource_key(~S,~P,identity),Q.Read{}}]},required,O.observe(~S,~C,~R,~E,~P,~Rest,~V,~identity,~lens,~view,~O.Declaration{}),render} 21 def optional(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~Rest:Type,~V:Data,~identity:Schema.Resource,~lens:Product.Lens,Rest>,~binding:B.Binding,~view:P -> P & V,render:Maybe<&2,V> -> String) -> Declaration>: 22 built(~S,~C,~R,~E,~P,~Rest,~V,~identity,~lens,~binding,~view,provided(~S,~C,~R,~E),render) 23 def required(~S:Data,~C:Type,~R:Type,~E:Data,~P:Type,~Rest:Type,~V:Data,~identity:Schema.Resource,~lens:Product.Lens,Rest>,~binding:B.Binding,~view:P -> P & V,render:Maybe<&2,V> -> String) -> Declaration>: 24 built(~S,~C,~R,~E,~P,~Rest,~V,~identity,~lens,~binding,~view,O.required(~S,~C,~R,~E,~P,~Rest,~V,~identity,~lens,~view,~O.Declaration{}),render) 25 def PairOps(~L:Type -> Type,~Right:Type -> Type,H:Type) -> Type: 26 Cap.Bundle 27 # Extra operational grants describe distinct actual fields, not a metadata mirror. 28 def with(~S:Data,~C:Type,~R:Type,~E:Data,~L:Type -> Type,~Right:Type -> Type,~V:Data,left:Declaration,right:Field.Declaration,E>,Right(T.Tx,E>)>) -> Declaration: 29 match left: 30 case Declaration{ordinary,required,observe,render}:Declaration{Field.pair(~S,~T.Tx,E>,~L(T.Tx,E>),~Right(T.Tx,E>),ordinary,right),required,observe,render} 31 def ordinary(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~V:Data,declaration:Declaration) -> Field.Declaration,E>,Ops(T.Tx,E>)>: 32 match declaration: 33 case Declaration{ordinary,_,_,_}:ordinary 34 def preflight(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~V:Data,declaration:Declaration,world:W.World) -> W.World & List<&2,String>: 35 match declaration: 36 case Declaration{_,required,_,_}:required(world) 37 def observer(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~V:Data,declaration:Declaration) -> W.World -> W.World & V: 38 match declaration: 39 case Declaration{_,_,observe,_}:observe 40 def presenter(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~V:Data,declaration:Declaration) -> V -> String: 41 match declaration: 42 case Declaration{_,_,_,render}:render 43 def names(~S:Data,clauses:List<&2,Q.Clause>) -> String: 44 match clauses: 45 case []:"" 46 case Q.Clause{name,_} <> []:name 47 case Q.Clause{name,_} <> rest:name ++ "," ++ names(~S,rest) 48 def name(~S:Data,~C:Type,~R:Type,~E:Data,~Ops:Type -> Type,~V:Data,declaration:Declaration) -> String: 49 names(~S,Field.clauses(~S,~T.Tx,E>,~Ops(T.Tx,E>),ordinary(~S,~C,~R,~E,~Ops,~V,declaration)))