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 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#[must_use]
196pub fn entity_layout(kind: EntityKind) -> Option<&'static EntityLayout> {
197 ENTITY_LAYOUTS.iter().find(|l| l.kind == kind)
198}