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
34
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))