1 import Base 2 import ./schema_fragments.bend as Fragment 3 import ./ordinary_owned_event_declaration.bend as D 4 import ./ordinary_owned_event_family_publisher.bend as Publisher 5 import ./ordinary_app_composer.bend as Build 6 import ./ordinary_app_records.bend as Pair 7 import ./ordinary_app_registration_fields.bend as Fields 8 import ./ordinary_app_recipe.bend as Tree 9 import ./ordinary_app_observation_data.bend as DTO 10 import ./ordinary_query_declaration.bend as Query 11 import ./transaction.bend as T 12 import ./system.bend as Sys 13 import ./world.bend as W 14 15 type Appended is Type: 16 Appended{app:After} 17 AppendRejected{app:Before} 18 def uses(keys:List<&2,String>) -> List<&2,Fields.DeclaredUse>: 19 match keys: 20 case []:[] 21 case key <> rest:Fields.DeclaredUse{Fields.EventUse{},Fields.MessageSource{},key,Query.Write{}} <> uses(rest) 22 def kind(description:D.Description) -> Fields.RegistrationKind: 23 match description: 24 case D.Description{keys,_}:Fields.MixedKind{uses(keys)} 25 def registered(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~Ops:Type -> Type,~builder:D.Builder(~W.World,~Recovery,~Ops),~declaration:D.Declaration,Recovery,Ops,builder>,~Args:Type,~Error:Data,~Out:Type,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome & Out),~Previous:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:Previous -> Previous & List<&2,Fields.Fields>,previous:Previous,recipe:Tree.Recipe,Rows,observe>,debug:Bool,result:Sys.RegistrationResult,Publisher.runner(~S,~C,~R,~E,~Recovery,~Ops,~builder,~declaration,~Args,~Error,~Out,~body)>) -> Appended,Previous,Rows,observe,fold>,Build.Registered,Previous & Pair.Record>,Rows,observe,Pair.fold_pair(~S,~Previous,~Pair.Record>,~fold,~Pair.observed(~S,~Fields.Token) )>>: 26 match result: 27 case Sys.Registered{world,Sys.Registry{namespace,id,name,access,cursor}}:Appended{Build.Registered{world,(previous,Pair.Record{Fields.Token{},Fields.Fields{namespace,id,name,access,cursor,"",[],kind(D.description(~S,~W.World,~Recovery,~Ops,~builder,declaration))}}),recipe,debug}} 28 case Sys.RegistrationFailed{world}:AppendRejected{Build.Registered{world,previous,recipe,debug}} 29 def admitted(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~Ops:Type -> Type,~builder:D.Builder(~W.World,~Recovery,~Ops),~declaration:D.Declaration,Recovery,Ops,builder>,~Args:Type,~Error:Data,~Out:Type,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome & Out),~Previous:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:Previous -> Previous & List<&2,Fields.Fields>,complete:Bool,app:Build.Registered,Previous,Rows,observe,fold>,name:String) -> Appended,Previous,Rows,observe,fold>,Build.Registered,Previous & Pair.Record>,Rows,observe,Pair.fold_pair(~S,~Previous,~Pair.Record>,~fold,~Pair.observed(~S,~Fields.Token) )>>: 30 match complete app: 31 case False{} app:AppendRejected{app} 32 case True{} Build.Registered{world,previous,recipe,debug}:registered(~S,~C,~R,~E,~Recovery,~Ops,~builder,~declaration,~Args,~Error,~Out,~body,~Previous,~Rows,~observe,~fold,previous,recipe,debug,Publisher.define(~S,~C,~R,~E,~Recovery,~Ops,~builder,~declaration,~Args,~Error,~Out,~body,world,name)) 33 def register(~S:Data,~C:Type,~R:Type,~E:Data,~Recovery:Type,~Ops:Type -> Type,~builder:D.Builder(~W.World,~Recovery,~Ops),~declaration:D.Declaration,Recovery,Ops,builder>,~Args:Type,~Error:Data,~Out:Type,~body:@-H:Type -> @-caps:Ops(H) -> Args -> H -> H & (T.Outcome & Out),~Previous:Type,~Rows:Data,~observe:W.World -> W.World & DTO.Observation,~fold:Previous -> Previous & List<&2,Fields.Fields>,app:Build.Registered,Previous,Rows,observe,fold>,name:String) -> Appended,Previous,Rows,observe,fold>,Build.Registered,Previous & Pair.Record>,Rows,observe,Pair.fold_pair(~S,~Previous,~Pair.Record>,~fold,~Pair.observed(~S,~Fields.Token) )>>: 34 admitted(~S,~C,~R,~E,~Recovery,~Ops,~builder,~declaration,~Args,~Error,~Out,~body,~Previous,~Rows,~observe,~fold,D.complete(D.description(~S,~W.World,~Recovery,~Ops,~builder,declaration)),app,name) 35 def event_entries(~S:Data,keys:List<&2,String>) -> List<&2,Fragment.Entry>: 36 match keys: 37 case []:[] 38 case +key <> rest:Fragment.Entry{Fragment.Event{},key,key} <> event_entries(~S,rest) 39 def entries(~S:Data,description:D.Description) -> List<&2,Fragment.Entry>: 40 match description: 41 case D.Description{keys,_}:event_entries(~S,keys)