inspector_metadata.bend
bendvy-ecs-core@0.1.0.1 · 58 lines · 0 definitions
1import Base
2import schedule_provision.bend as Provision
3
4# Trusted declaration metadata carries no provider, World or callback grant.
5type Resource<S:Data> is Data:
6 Resource{id:U32,name:String}
7type Metadata<S:Data> is Data:
8 Metadata{name:String,requirements:List<&2,Resource<S>>}
9type Definition<-S:Data,-Plan:Type> is Type:
10 Definition{metadata:Metadata<S>,plan:Plan}
11
12def token(~S:Data,value:Resource<S>) -> Provision.Requirement<S>:
13 match value:
14 case Resource{id,_}:Provision.Resource{id}
15def tokens(~S:Data,values:List<&2,Resource<S>>) -> List<&2,Provision.Requirement<S>>:
16 match values:
17 case []:[]
18 case value <> rest:token(~S,value) <> tokens(~S,rest)
19def choose_first(~S:Data,matched:Bool,value:Resource<S>,alternative:Maybe<&2,Resource<S>>) -> Maybe<&2,Resource<S>>:
20 match matched:
21 case True{}:Some{value}
22 case False{}:alternative
23def first(~S:Data,+id:U32,values:List<&2,Resource<S>>) -> Maybe<&2,Resource<S>>:
24 match values:
25 case []:None{}
26 case +value <> rest:
27 match value:
28 case Resource{key,_}:
29 choose_first(~S,U32.is_eq(id,key),value,first(~S,id,rest))
30def keep(~S:Data,value:Maybe<&2,Resource<S>>,rest:List<&2,Resource<S>>) -> List<&2,Resource<S>>:
31 match value:
32 case None{}:rest
33 case Some{value}:value <> rest
34# Internal keys are lowered exclusively from Resource; wider provision token
35# cases have no source entry and confer no category/provider capability.
36def names(~S:Data,keys:List<&2,Provision.Requirement<S>>,+values:List<&2,Resource<S>>) -> List<&2,Resource<S>>:
37 match keys:
38 case []:[]
39 case Provision.Resource{id} <> rest:keep(~S,first(~S,id,values),names(~S,rest,values))
40 case _ <> rest:names(~S,rest,values)
41def normalize(~S:Data,+values:List<&2,Resource<S>>) -> List<&2,Resource<S>>:
42 names(~S,Provision.unique(~S,tokens(~S,values)),values)
43def make(~S:Data,~Plan:Type,name:String,requirements:List<&2,Resource<S>>,plan:Plan) -> Definition<S,Plan>:
44 Definition{Metadata{name,normalize(~S,requirements)},plan}
45def read(~S:Data,~Plan:Type,definition:Definition<S,Plan>) -> Definition<S,Plan> & Metadata<S>:
46 match definition:
47 case Definition{+metadata,plan}:(Definition{metadata,plan},metadata)
48def into_plan(~S:Data,~Plan:Type,definition:Definition<S,Plan>) -> Plan:
49 match definition:
50 case Definition{_,plan}:plan
51def kind(~S:Data,metadata:Metadata<S>) -> String:
52 "inspector"
53def name(~S:Data,metadata:Metadata<S>) -> String:
54 match metadata:
55 case Metadata{name,_}:name
56def requirements(~S:Data,metadata:Metadata<S>) -> List<&2,Resource<S>>:
57 match metadata:
58 case Metadata{_,requirements}:requirements