1 import Base
2 import ./decode_data.bend as D
3 import ./decode_capabilities.bend as Public
4 import ./decode.bend as Complete
5 import ./ordinary_declaration.bend as Canonical
6
7 # Extensions of ONE ordinary nominal identity, shared with ordinary query paths.
8 # Schema authoring is trusted; no language-wide constructor secrecy is asserted.
9 type Plain<-S:Data,-P:Type,-identity:Canonical.Declaration> is Data:
10 Plain{}
11 type Transient<-S:Data,-P:Type,-identity:Canonical.Declaration> is Data:
12 Transient{}
13 type Constructed<-S:Data,-P:Type,-identity:Canonical.Declaration,-project:P -> P & D.Raw> is Data:
14 Constructed{codec:D.Codec}
15 def plain(~S:Data,~P:Type,~identity:Canonical.Declaration) -> Plain:
16 Plain{}
17 def transient(~S:Data,~P:Type,~identity:Canonical.Declaration) -> Transient:
18 Transient{}
19 def constructed(~S:Data,~P:Type,~identity:Canonical.Declaration,~project:P -> P & D.Raw,codec:D.Codec) -> Constructed:
20 Constructed{codec}
21 def codec(~S:Data,~P:Type,~identity:Canonical.Declaration,~project:P -> P & D.Raw,declaration:Constructed) -> D.Codec:
22 match declaration:
23 case Constructed{codec}:codec
24
25 # The SAME retained declaration supplies complete #46 validation and save codec.
26 # Projects once; no caller fuel/depth and no automatic Raw -> arbitrary P inverse.
27 def validate(~S:Data,~P:Type,~identity:Canonical.Declaration,~project:P -> P & D.Raw,declaration:Constructed,owner:P) -> D.Receipt
:
28 Complete.decode_owner(~P,~project,codec(~S,~P,~identity,~project,declaration),owner)
29 def prepare(~S:Data,~P:Type,~identity:Canonical.Declaration,~project:P -> P & D.Raw,+declaration:Constructed,owner:P) -> Constructed & D.Receipt
:
30 (declaration,validate(~S,~P,~identity,~project,declaration,owner))
31
32 # Actual generic public admission callback retains every incoming affine owner.
33 # The retained list is a transport context, never the live ECS Store.
34 type Context<-S:Data,-P:Type,-identity:Canonical.Declaration,-project:P -> P & D.Raw> is Type:
35 Context{declaration:Constructed,retained:List
}
36 def decode(~S:Data,~P:Type,~identity:Canonical.Declaration,~project:P -> P & D.Raw,context:Context,owner:P) -> Context & D.Receipt
:
37 match context:
38 case Context{+declaration,retained}:(Context{declaration,retained},validate(~S,~P,~identity,~project,declaration,owner))
39 def admit(~S:Data,~P:Type,~identity:Canonical.Declaration,~project:P -> P & D.Raw,context:Context,receipt:D.Receipt
) -> Context & D.Checked:
40 match context receipt:
41 case Context{declaration,retained} D.Receipt{owner,checked}:(Context{declaration,owner <> retained},checked)
42 def request(~S:Data,~P:Type,~identity:Canonical.Declaration,~project:P -> P & D.Raw,context:Context,owner:P) -> Context & D.Checked:
43 Public.request(~P,~Context,~D.Checked,~decode(~S,~P,~identity,~project),~admit(~S,~P,~identity,~project),context,owner)