1use core::{
2 fmt::{self, Display},
3 num::NonZeroUsize,
4};
5
6use aranya_policy_ast::Identifier;
7use serde::{Deserialize, Serialize};
8
9mod meta;
10
11pub use meta::*;
12
13use crate::{Label, data::Value};
14
15#[must_use]
17#[derive(
18 Clone,
19 Debug,
20 Eq,
21 PartialEq,
22 Serialize,
23 Deserialize,
24 rkyv::Archive,
25 rkyv::Deserialize,
26 rkyv::Serialize,
27)]
28pub enum ExitReason {
29 Normal,
31 Yield,
33 Check,
35 Panic,
37}
38
39impl ExitReason {
40 #[cfg(feature = "testing")]
42 pub fn success(self) {
43 assert_eq!(self, Self::Normal);
44 }
45}
46
47impl Display for ExitReason {
48 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
49 match self {
50 Self::Normal => f.write_str("normal"),
51 Self::Yield => f.write_str("yield"),
52 Self::Check => f.write_str("check"),
53 Self::Panic => f.write_str("panic"),
54 }
55 }
56}
57
58#[derive(
60 Debug,
61 Clone,
62 Eq,
63 PartialEq,
64 Serialize,
65 Deserialize,
66 rkyv::Archive,
67 rkyv::Deserialize,
68 rkyv::Serialize,
69)]
70pub enum Target {
71 Unresolved(Label),
73 Resolved(usize),
75}
76
77impl Target {
78 pub fn resolved(&self) -> Option<usize> {
80 match self {
81 Self::Resolved(i) => Some(*i),
82 Self::Unresolved(_) => None,
83 }
84 }
85}
86
87impl Display for Target {
88 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
89 match self {
90 Self::Unresolved(label) => write!(f, "<{label}>"),
91 Self::Resolved(addr) => write!(f, "{addr}"),
92 }
93 }
94}
95
96#[derive(
98 Debug,
99 Clone,
100 Eq,
101 PartialEq,
102 Serialize,
103 Deserialize,
104 rkyv::Archive,
105 rkyv::Deserialize,
106 rkyv::Serialize,
107)]
108pub enum Instruction {
109 Const(Value),
112 Def(Identifier),
114 Get(Identifier),
116 Dup,
118 Pop,
120 Block,
123 End,
125 Jump(Target),
127 Branch(Target),
129 Next,
131 Last,
133 Call(Target),
135 ExtCall(usize, usize),
137 Return,
139 Exit(ExitReason),
141 Add,
144 Sub,
146 SaturatingAdd,
148 SaturatingSub,
150 Not,
152 Gt,
154 Lt,
156 Eq,
158 FactNew(Identifier),
161 FactKeySet(Identifier),
163 FactValueSet(Identifier),
165 StructNew(Identifier),
168 StructSet(Identifier),
170 StructGet(Identifier),
172 MStructSet(NonZeroUsize),
174 MStructGet(NonZeroUsize),
176 Cast(Identifier),
178 Publish,
181 Create,
183 Delete,
185 Update,
187 Emit,
189 Query,
191 FactCount(i64),
193 QueryStart,
195 QueryNext(Identifier),
197 Serialize,
199 Deserialize,
201 SaveSP,
203 RestoreSP,
205 Some,
207 Unwrap,
209 Meta(Meta),
211}
212
213impl Display for Instruction {
214 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
215 match self {
216 Self::Const(v) => write!(f, "const {v}"),
217 Self::Def(ident) => write!(f, "def {ident}"),
218 Self::Get(ident) => write!(f, "get {ident}"),
219 Self::Dup => write!(f, "dup"),
220 Self::Pop => write!(f, "pop"),
221 Self::Block => write!(f, "block"),
222 Self::End => write!(f, "end"),
223 Self::Jump(t) => write!(f, "jump {t}"),
224 Self::Branch(t) => write!(f, "branch {t}"),
225 Self::Next => write!(f, "next"),
226 Self::Last => write!(f, "last"),
227 Self::Call(t) => write!(f, "call {t}"),
228 Self::ExtCall(module, proc) => write!(f, "extcall {module} {proc}"),
229 Self::Return => write!(f, "return"),
230 Self::Exit(reason) => write!(f, "exit {reason}"),
231 Self::Add => write!(f, "add"),
232 Self::Sub => write!(f, "sub"),
233 Self::SaturatingAdd => write!(f, "saturating_add"),
234 Self::SaturatingSub => write!(f, "saturating_sub"),
235 Self::Not => write!(f, "not"),
236 Self::Gt => write!(f, "gt"),
237 Self::Lt => write!(f, "lt"),
238 Self::Eq => write!(f, "eq"),
239 Self::FactNew(ident) => write!(f, "fact.new {ident}"),
240 Self::FactKeySet(ident) => write!(f, "fact.kset {ident}"),
241 Self::FactValueSet(ident) => write!(f, "fact.vset {ident}"),
242 Self::StructNew(ident) => write!(f, "struct.new {ident}"),
243 Self::StructSet(ident) => write!(f, "struct.set {ident}"),
244 Self::StructGet(ident) => write!(f, "struct.get {ident}"),
245 Self::MStructGet(n) => write!(f, "mstruct.get {n}"),
246 Self::MStructSet(n) => write!(f, "mstruct.set {n}"),
247 Self::Publish => write!(f, "publish"),
248 Self::Create => write!(f, "create"),
249 Self::Delete => write!(f, "delete"),
250 Self::Update => write!(f, "update"),
251 Self::Emit => write!(f, "emit"),
252 Self::Query => write!(f, "query"),
253 Self::FactCount(limit) => write!(f, "fact.count {limit}"),
254 Self::QueryStart => write!(f, "query.start"),
255 Self::QueryNext(ident) => write!(f, "query.next {ident}"),
256 Self::Serialize => write!(f, "serialize"),
257 Self::Deserialize => write!(f, "deserialize"),
258 Self::SaveSP => write!(f, "save SP"),
259 Self::RestoreSP => write!(f, "restore SP"),
260 Self::Some => write!(f, "some"),
261 Self::Unwrap => write!(f, "unwrap"),
262 Self::Meta(m) => write!(f, "meta: {m}"),
263 Self::Cast(identifier) => write!(f, "cast {identifier}"),
264 }
265 }
266}