Skip to main content

nomiscript/runtime/
entity_layout.rs

1//! Auto-generated from doc/scripting/entity_registry.org.
2//! Do not edit manually — edit the org file + cargo build.
3//!
4//! Name-bearing entity field layout for the host value decoder.
5//! Field ORDER matches the wasm struct slot order in `ENTITY_SPECS`
6//! (accessor rows, then struct-only extras), so a field's position
7//! here is its `struct.get` index.
8
9use crate::ast::EntityKind;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub enum EntityFieldKind {
13    String,
14    Ratio,
15    I32,
16    Pair,
17}
18
19#[derive(Debug, Clone, Copy)]
20pub struct EntityFieldLayout {
21    pub name: &'static str,
22    pub kind: EntityFieldKind,
23}
24
25#[derive(Debug, Clone, Copy)]
26pub struct EntityLayout {
27    pub kind: EntityKind,
28    pub label: &'static str,
29    pub fields: &'static [EntityFieldLayout],
30}
31
32pub const ENTITY_LAYOUTS: &[EntityLayout] = &[
33    EntityLayout {
34        kind: EntityKind::Account,
35        label: "account",
36        fields: &[
37            EntityFieldLayout {
38                name: "id",
39                kind: EntityFieldKind::String,
40            },
41            EntityFieldLayout {
42                name: "name",
43                kind: EntityFieldKind::String,
44            },
45            EntityFieldLayout {
46                name: "parent",
47                kind: EntityFieldKind::String,
48            },
49            EntityFieldLayout {
50                name: "type",
51                kind: EntityFieldKind::String,
52            },
53        ],
54    },
55    EntityLayout {
56        kind: EntityKind::Commodity,
57        label: "commodity",
58        fields: &[
59            EntityFieldLayout {
60                name: "id",
61                kind: EntityFieldKind::String,
62            },
63            EntityFieldLayout {
64                name: "symbol",
65                kind: EntityFieldKind::String,
66            },
67            EntityFieldLayout {
68                name: "name",
69                kind: EntityFieldKind::String,
70            },
71        ],
72    },
73    EntityLayout {
74        kind: EntityKind::Transaction,
75        label: "transaction",
76        fields: &[
77            EntityFieldLayout {
78                name: "id",
79                kind: EntityFieldKind::String,
80            },
81            EntityFieldLayout {
82                name: "note",
83                kind: EntityFieldKind::String,
84            },
85            EntityFieldLayout {
86                name: "amount",
87                kind: EntityFieldKind::String,
88            },
89            EntityFieldLayout {
90                name: "post-date",
91                kind: EntityFieldKind::String,
92            },
93        ],
94    },
95    EntityLayout {
96        kind: EntityKind::Split,
97        label: "split",
98        fields: &[
99            EntityFieldLayout {
100                name: "id",
101                kind: EntityFieldKind::String,
102            },
103            EntityFieldLayout {
104                name: "account-id",
105                kind: EntityFieldKind::String,
106            },
107            EntityFieldLayout {
108                name: "commodity-id",
109                kind: EntityFieldKind::String,
110            },
111            EntityFieldLayout {
112                name: "value",
113                kind: EntityFieldKind::Ratio,
114            },
115        ],
116    },
117    EntityLayout {
118        kind: EntityKind::Tag,
119        label: "tag",
120        fields: &[
121            EntityFieldLayout {
122                name: "id",
123                kind: EntityFieldKind::String,
124            },
125            EntityFieldLayout {
126                name: "name",
127                kind: EntityFieldKind::String,
128            },
129            EntityFieldLayout {
130                name: "value",
131                kind: EntityFieldKind::String,
132            },
133        ],
134    },
135    EntityLayout {
136        kind: EntityKind::Price,
137        label: "price",
138        fields: &[
139            EntityFieldLayout {
140                name: "id",
141                kind: EntityFieldKind::String,
142            },
143            EntityFieldLayout {
144                name: "commodity-id",
145                kind: EntityFieldKind::String,
146            },
147            EntityFieldLayout {
148                name: "currency-id",
149                kind: EntityFieldKind::String,
150            },
151            EntityFieldLayout {
152                name: "value",
153                kind: EntityFieldKind::Ratio,
154            },
155            EntityFieldLayout {
156                name: "price-date",
157                kind: EntityFieldKind::String,
158            },
159        ],
160    },
161    EntityLayout {
162        kind: EntityKind::SshKey,
163        label: "sshkey",
164        fields: &[
165            EntityFieldLayout {
166                name: "id",
167                kind: EntityFieldKind::String,
168            },
169            EntityFieldLayout {
170                name: "fingerprint",
171                kind: EntityFieldKind::String,
172            },
173            EntityFieldLayout {
174                name: "name",
175                kind: EntityFieldKind::String,
176            },
177            EntityFieldLayout {
178                name: "key-type",
179                kind: EntityFieldKind::String,
180            },
181            EntityFieldLayout {
182                name: "created-at",
183                kind: EntityFieldKind::String,
184            },
185            EntityFieldLayout {
186                name: "last-used-at",
187                kind: EntityFieldKind::String,
188            },
189        ],
190    },
191];
192
193/// The decode layout for `kind`, or `None` for kinds with no field
194/// layout (e.g. `Condition`, which isn't a server entity).
195#[must_use]
196pub fn entity_layout(kind: EntityKind) -> Option<&'static EntityLayout> {
197    ENTITY_LAYOUTS.iter().find(|l| l.kind == kind)
198}