execution_save_recipe.bend

bendvy-ecs-core@0.1.0.3 · 39 lines · 9 definitions

1import Base
2import bendvy-ecs-core@0.1.0.3/ordinary_declaration.bend as C
3import bendvy-ecs-core@0.1.0.3/persistence_declaration.bend as Decl
4import bendvy-ecs-core@0.1.0.3/decode_data.bend as D
5import bendvy-ecs-core@0.1.0.3/decode.bend as Decode
6
7type Leaf<-S:Data,-P:Type,-identity:C.Declaration<S,P>,-project:P -> P & D.Raw> is Type:
8  Plain{}
9  Transient{}
10  Constructed{declaration:Decl.Constructed<S,P,identity,project>}
11type Refusal is Data:
12  PlainUnserializable{key:String}
13  InvalidProjection{key:String,error:D.Error}
14  MalformedColumn{key:String}
15  DescriptorMismatch{expected:String,actual:String}
16type Field is Data:
17  Omitted{}
18  Saved{field:D.Field}
19  Refused{reason:Refusal}
20
21def plain(~S:Data,~P:Type,~identity:C.Declaration<S,P>,~project:P -> P & D.Raw,declaration:Decl.Plain<S,P,identity>) -> Leaf<S,P,identity,project>:Plain{}
22def transient(~S:Data,~P:Type,~identity:C.Declaration<S,P>,~project:P -> P & D.Raw,declaration:Decl.Transient<S,P,identity>) -> Leaf<S,P,identity,project>:Transient{}
23def constructed(~S:Data,~P:Type,~identity:C.Declaration<S,P>,~project:P -> P & D.Raw,declaration:Decl.Constructed<S,P,identity,project>) -> Leaf<S,P,identity,project>:Constructed{declaration}
24def eligibility(~S:Data,~P:Type,~identity:C.Declaration<S,P>,~project:P -> P & D.Raw,recipe:Leaf<S,P,identity,project>) -> Leaf<S,P,identity,project> & Maybe<&2,Refusal>:
25  match recipe:
26    case Plain{}:(Plain{},Some{PlainUnserializable{C.key(~S,~P,identity)}})
27    case Transient{}:(Transient{},None{})
28    case Constructed{declaration}:(Constructed{declaration},None{})
29def projected(~S:Data,~P:Type,~identity:C.Declaration<S,P>,~project:P -> P & D.Raw,declaration:Decl.Constructed<S,P,identity,project>,result:D.Receipt<P>) -> Leaf<S,P,identity,project> & (P & Field):
30  match result:
31    case D.Receipt{owner,D.Accepted{value}}:(Constructed{declaration},(owner,Saved{D.Field{C.key(~S,~P,identity),value}}))
32    case D.Receipt{owner,D.Rejected{error}}:(Constructed{declaration},(owner,Refused{InvalidProjection{C.key(~S,~P,identity),error}}))
33# The same retained ordinary declaration supplies codec and actual-owner
34# projection. Transient and Plain never evaluate the projection.
35def export(~S:Data,~P:Type,~identity:C.Declaration<S,P>,~project:P -> P & D.Raw,recipe:Leaf<S,P,identity,project>,owner:P) -> Leaf<S,P,identity,project> & (P & Field):
36  match recipe:
37    case Plain{}:(Plain{},(owner,Refused{PlainUnserializable{C.key(~S,~P,identity)}}))
38    case Transient{}:(Transient{},(owner,Omitted{}))
39    case Constructed{+declaration}:projected(~S,~P,~identity,~project,declaration,Decode.decode_owner(~P,~project,Decl.codec(~S,~P,~identity,~project,declaration),owner))