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

            
9
use crate::ast::EntityKind;
10

            
11
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12
pub enum EntityFieldKind {
13
    String,
14
    Ratio,
15
    I32,
16
    Pair,
17
}
18

            
19
#[derive(Debug, Clone, Copy)]
20
pub struct EntityFieldLayout {
21
    pub name: &'static str,
22
    pub kind: EntityFieldKind,
23
}
24

            
25
#[derive(Debug, Clone, Copy)]
26
pub struct EntityLayout {
27
    pub kind: EntityKind,
28
    pub label: &'static str,
29
    pub fields: &'static [EntityFieldLayout],
30
}
31

            
32
pub const ENTITY_LAYOUTS: &[EntityLayout] = &[
33
    EntityLayout {
34
        kind: EntityKind::Account,
35
        label: "account",
36
        fields: &[
37
        EntityFieldLayout { name: "id", kind: EntityFieldKind::String },
38
        EntityFieldLayout { name: "name", kind: EntityFieldKind::String },
39
        EntityFieldLayout { name: "parent", kind: EntityFieldKind::String },
40
        ],
41
    },
42
    EntityLayout {
43
        kind: EntityKind::Commodity,
44
        label: "commodity",
45
        fields: &[
46
        EntityFieldLayout { name: "id", kind: EntityFieldKind::String },
47
        EntityFieldLayout { name: "symbol", kind: EntityFieldKind::String },
48
        EntityFieldLayout { name: "name", kind: EntityFieldKind::String },
49
        ],
50
    },
51
    EntityLayout {
52
        kind: EntityKind::Transaction,
53
        label: "transaction",
54
        fields: &[
55
        EntityFieldLayout { name: "id", kind: EntityFieldKind::String },
56
        EntityFieldLayout { name: "note", kind: EntityFieldKind::String },
57
        EntityFieldLayout { name: "post-date", kind: EntityFieldKind::String },
58
        ],
59
    },
60
    EntityLayout {
61
        kind: EntityKind::Split,
62
        label: "split",
63
        fields: &[
64
        EntityFieldLayout { name: "id", kind: EntityFieldKind::String },
65
        EntityFieldLayout { name: "account-id", kind: EntityFieldKind::String },
66
        EntityFieldLayout { name: "commodity-id", kind: EntityFieldKind::String },
67
        EntityFieldLayout { name: "value", kind: EntityFieldKind::Ratio },
68
        ],
69
    },
70
    EntityLayout {
71
        kind: EntityKind::Tag,
72
        label: "tag",
73
        fields: &[
74
        EntityFieldLayout { name: "id", kind: EntityFieldKind::String },
75
        EntityFieldLayout { name: "name", kind: EntityFieldKind::String },
76
        EntityFieldLayout { name: "value", kind: EntityFieldKind::String },
77
        ],
78
    },
79
    EntityLayout {
80
        kind: EntityKind::Price,
81
        label: "price",
82
        fields: &[
83
        EntityFieldLayout { name: "id", kind: EntityFieldKind::String },
84
        EntityFieldLayout { name: "commodity-id", kind: EntityFieldKind::String },
85
        EntityFieldLayout { name: "currency-id", kind: EntityFieldKind::String },
86
        EntityFieldLayout { name: "value", kind: EntityFieldKind::Ratio },
87
        EntityFieldLayout { name: "price-date", kind: EntityFieldKind::String },
88
        ],
89
    },
90
    EntityLayout {
91
        kind: EntityKind::SshKey,
92
        label: "sshkey",
93
        fields: &[
94
        EntityFieldLayout { name: "id", kind: EntityFieldKind::String },
95
        EntityFieldLayout { name: "fingerprint", kind: EntityFieldKind::String },
96
        EntityFieldLayout { name: "name", kind: EntityFieldKind::String },
97
        ],
98
    },
99
    EntityLayout {
100
        kind: EntityKind::ReportNode,
101
        label: "reportnode",
102
        fields: &[
103
        EntityFieldLayout { name: "id", kind: EntityFieldKind::String },
104
        EntityFieldLayout { name: "label", kind: EntityFieldKind::String },
105
        EntityFieldLayout { name: "depth", kind: EntityFieldKind::I32 },
106
        EntityFieldLayout { name: "amount", kind: EntityFieldKind::Ratio },
107
        EntityFieldLayout { name: "children", kind: EntityFieldKind::Pair },
108
        ],
109
    },
110
];
111

            
112
/// The decode layout for `kind`, or `None` for kinds with no field
113
/// layout (e.g. `Condition`, which isn't a server entity).
114
#[must_use]
115
pub fn entity_layout(kind: EntityKind) -> Option<&'static EntityLayout> {
116
    ENTITY_LAYOUTS.iter().find(|l| l.kind == kind)
117
}