1extern crate alloc;
4
5use alloc::{boxed::Box, collections::BTreeMap, vec::Vec};
6use core::fmt::{self, Display};
7
8use aranya_policy_ast::{self as ast, Identifier, Param};
9use serde::{Deserialize, Serialize};
10
11use crate::{
12 CodeMap, Instruction, Label, Value,
13 named::{NamedMap, named},
14};
15
16#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]
18pub enum Version {
19 V0,
21}
22
23impl Version {
24 pub const fn as_str(&self) -> &'static str {
26 match self {
27 Self::V0 => "V0",
28 }
29 }
30}
31
32impl Display for Version {
33 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34 f.write_str(self.as_str())
35 }
36}
37
38#[derive(Debug, Eq, PartialEq, thiserror::Error)]
40#[error("unsupported module version")]
41pub struct UnsupportedVersion(());
42
43#[derive(
46 Clone,
47 Debug,
48 Serialize,
49 Deserialize,
50 Eq,
51 PartialEq,
52 rkyv::Archive,
53 rkyv::Deserialize,
54 rkyv::Serialize,
55)]
56pub struct Module {
57 pub data: ModuleData,
59 }
61
62impl Module {
63 pub const fn version(&self) -> Version {
65 match self.data {
66 ModuleData::V0(_) => Version::V0,
67 }
68 }
69}
70
71#[derive(
73 Clone,
74 Debug,
75 Eq,
76 PartialEq,
77 Serialize,
78 Deserialize,
79 rkyv::Archive,
80 rkyv::Deserialize,
81 rkyv::Serialize,
82)]
83#[serde(tag = "version")]
84pub enum ModuleData {
85 V0(ModuleV0),
87}
88
89#[derive(
91 Clone,
92 Debug,
93 Eq,
94 PartialEq,
95 Serialize,
96 Deserialize,
97 rkyv::Archive,
98 rkyv::Deserialize,
99 rkyv::Serialize,
100)]
101#[serde(deny_unknown_fields)]
102pub struct ModuleV0 {
103 pub progmem: Box<[Instruction]>,
105 pub labels: BTreeMap<Label, usize>,
107 pub action_defs: NamedMap<ActionDef>,
109 pub command_defs: NamedMap<CommandDef>,
111 pub fact_defs: BTreeMap<Identifier, ast::FactDefinition>,
113 pub struct_defs: BTreeMap<Identifier, Vec<ast::FieldDefinition>>,
115 pub enum_defs: BTreeMap<Identifier, BTreeMap<Identifier, i64>>,
117 pub codemap: Option<CodeMap>,
119 pub globals: BTreeMap<Identifier, Value>,
121}
122
123#[derive(
125 Clone,
126 Debug,
127 Eq,
128 PartialEq,
129 Serialize,
130 Deserialize,
131 rkyv::Archive,
132 rkyv::Deserialize,
133 rkyv::Serialize,
134)]
135pub struct ActionDef {
136 pub name: ast::Ident,
138 pub persistence: ast::Persistence,
140 pub params: NamedMap<Param>,
142}
143named!(ActionDef);
144
145#[derive(
147 Clone,
148 Debug,
149 Eq,
150 PartialEq,
151 Serialize,
152 Deserialize,
153 rkyv::Archive,
154 rkyv::Deserialize,
155 rkyv::Serialize,
156)]
157pub struct CommandDef {
158 pub name: ast::Ident,
160 pub persistence: ast::Persistence,
162 pub attributes: NamedMap<Attribute>,
164 pub fields: NamedMap<Field>,
166}
167named!(CommandDef);
168
169#[derive(
171 Clone,
172 Debug,
173 Eq,
174 PartialEq,
175 Serialize,
176 Deserialize,
177 rkyv::Archive,
178 rkyv::Deserialize,
179 rkyv::Serialize,
180)]
181pub struct Attribute {
182 pub name: ast::Ident,
184 pub value: Value,
186}
187named!(Attribute);
188
189#[derive(
191 Clone,
192 Debug,
193 Eq,
194 PartialEq,
195 Serialize,
196 Deserialize,
197 rkyv::Archive,
198 rkyv::Deserialize,
199 rkyv::Serialize,
200)]
201pub struct Field {
202 pub name: ast::Ident,
204 pub ty: ast::VType,
206}
207named!(Field);