1 import Base 2 import ./snapshot_leaf.bend as Leaf 3 import ./persistence_declaration.bend as Decl 4 import ./decode_data.bend as D 5 import ./schema_fragments.bend as Fragment 6 import ./column.bend as Col 7 import ./ordinary_declaration.bend as Canonical 8 import ./owner_product.bend as Product 9 import ./ordinary_schema.bend as Ordinary 10 11 # The same schema factory derives ordinary inventory, physical product and save 12 # eligibility/closed traversal. Runtime recipes live in the leaf owners. 13 type Schema<-S:Data,-C:Type,-R:Type,-eligible:Bool,-components:U32 -> C -> C & List<&2,D.Field>,-resources:R -> R & List<&2,D.Field>> is Data: 14 Schema{ordinary:Ordinary.Schema} 15 def unit_component(id:U32,value:Unit) -> Unit & List<&2,D.Field>: 16 (value,[]) 17 def unit_resource(value:Unit) -> Unit & List<&2,D.Field>: 18 (value,[]) 19 def plain_component_fields(~S:Data,~P:Type,id:U32,value:Col.Column) -> Col.Column & List<&2,D.Field>: 20 (value,[]) 21 def entry(~S:Data,~P:Type,~identity:Canonical.Declaration,kind:Fragment.RegistryKind) -> Fragment.Entry: 22 +key=Canonical.key(~S,~P,identity) 23 Fragment.Entry{kind,key,key} 24 def component(~S:Data,~P:Type,~identity:Canonical.Declaration,~project:P -> P & D.Raw) -> Schema,Unit,True{},Leaf.component_fields(~S,~P,~identity,~project),unit_resource>: 25 Schema{Ordinary.Schema{[entry(~S,~P,~identity,Fragment.Component{})]}} 26 def transient_component(~S:Data,~P:Type,~identity:Canonical.Declaration) -> Schema,Unit,True{},Leaf.transient_component_fields(~S,~P,~identity),unit_resource>: 27 Schema{Ordinary.Schema{[entry(~S,~P,~identity,Fragment.Component{})]}} 28 def plain_component(~S:Data,~P:Type,~identity:Canonical.Declaration) -> Schema,Unit,False{},plain_component_fields(~S,~P),unit_resource>: 29 Schema{Ordinary.Schema{[entry(~S,~P,~identity,Fragment.Component{})]}} 30 def resource(~S:Data,~P:Type,~identity:Canonical.Declaration,~project:P -> P & D.Raw) -> Schema,True{},unit_component,Leaf.resource_fields(~S,~P,~identity,~project)>: 31 Schema{Ordinary.Schema{[entry(~S,~P,~identity,Fragment.Resource{})]}} 32 def transient_resource(~S:Data,~P:Type,~identity:Canonical.Declaration) -> Schema,True{},unit_component,Leaf.transient_resource_fields(~S,~P,~identity)>: 33 Schema{Ordinary.Schema{[entry(~S,~P,~identity,Fragment.Resource{})]}} 34 def plain_resource_fields(~P:Type,value:P) -> P & List<&2,D.Field>: 35 (value,[]) 36 def plain_resource(~S:Data,~P:Type,~identity:Canonical.Declaration) -> Schema: 37 Schema{Ordinary.Schema{[entry(~S,~P,~identity,Fragment.Resource{})]}} 38 def inventory(~S:Data,~C:Type,~R:Type,~eligible:Bool,~components:U32 -> C -> C & List<&2,D.Field>,~resources:R -> R & List<&2,D.Field>,schema:Schema) -> Ordinary.Schema: 39 match schema: 40 case Schema{ordinary}:ordinary