1use 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 ],
50 },
51 EntityLayout {
52 kind: EntityKind::Commodity,
53 label: "commodity",
54 fields: &[
55 EntityFieldLayout {
56 name: "id",
57 kind: EntityFieldKind::String,
58 },
59 EntityFieldLayout {
60 name: "symbol",
61 kind: EntityFieldKind::String,
62 },
63 EntityFieldLayout {
64 name: "name",
65 kind: EntityFieldKind::String,
66 },
67 ],
68 },
69 EntityLayout {
70 kind: EntityKind::Transaction,
71 label: "transaction",
72 fields: &[
73 EntityFieldLayout {
74 name: "id",
75 kind: EntityFieldKind::String,
76 },
77 EntityFieldLayout {
78 name: "note",
79 kind: EntityFieldKind::String,
80 },
81 EntityFieldLayout {
82 name: "post-date",
83 kind: EntityFieldKind::String,
84 },
85 ],
86 },
87 EntityLayout {
88 kind: EntityKind::Split,
89 label: "split",
90 fields: &[
91 EntityFieldLayout {
92 name: "id",
93 kind: EntityFieldKind::String,
94 },
95 EntityFieldLayout {
96 name: "account-id",
97 kind: EntityFieldKind::String,
98 },
99 EntityFieldLayout {
100 name: "commodity-id",
101 kind: EntityFieldKind::String,
102 },
103 EntityFieldLayout {
104 name: "value",
105 kind: EntityFieldKind::Ratio,
106 },
107 ],
108 },
109 EntityLayout {
110 kind: EntityKind::Tag,
111 label: "tag",
112 fields: &[
113 EntityFieldLayout {
114 name: "id",
115 kind: EntityFieldKind::String,
116 },
117 EntityFieldLayout {
118 name: "name",
119 kind: EntityFieldKind::String,
120 },
121 EntityFieldLayout {
122 name: "value",
123 kind: EntityFieldKind::String,
124 },
125 ],
126 },
127 EntityLayout {
128 kind: EntityKind::Price,
129 label: "price",
130 fields: &[
131 EntityFieldLayout {
132 name: "id",
133 kind: EntityFieldKind::String,
134 },
135 EntityFieldLayout {
136 name: "commodity-id",
137 kind: EntityFieldKind::String,
138 },
139 EntityFieldLayout {
140 name: "currency-id",
141 kind: EntityFieldKind::String,
142 },
143 EntityFieldLayout {
144 name: "value",
145 kind: EntityFieldKind::Ratio,
146 },
147 EntityFieldLayout {
148 name: "price-date",
149 kind: EntityFieldKind::String,
150 },
151 ],
152 },
153 EntityLayout {
154 kind: EntityKind::SshKey,
155 label: "sshkey",
156 fields: &[
157 EntityFieldLayout {
158 name: "id",
159 kind: EntityFieldKind::String,
160 },
161 EntityFieldLayout {
162 name: "fingerprint",
163 kind: EntityFieldKind::String,
164 },
165 EntityFieldLayout {
166 name: "name",
167 kind: EntityFieldKind::String,
168 },
169 ],
170 },
171 EntityLayout {
172 kind: EntityKind::ReportNode,
173 label: "reportnode",
174 fields: &[
175 EntityFieldLayout {
176 name: "id",
177 kind: EntityFieldKind::String,
178 },
179 EntityFieldLayout {
180 name: "label",
181 kind: EntityFieldKind::String,
182 },
183 EntityFieldLayout {
184 name: "depth",
185 kind: EntityFieldKind::I32,
186 },
187 EntityFieldLayout {
188 name: "amount",
189 kind: EntityFieldKind::Ratio,
190 },
191 EntityFieldLayout {
192 name: "children",
193 kind: EntityFieldKind::Pair,
194 },
195 ],
196 },
197];
198
199#[must_use]
202pub fn entity_layout(kind: EntityKind) -> Option<&'static EntityLayout> {
203 ENTITY_LAYOUTS.iter().find(|l| l.kind == kind)
204}