aranya_policy_vm/
stack.rs1use aranya_policy_module::{TryAsMut, TryFromValue, Value, ValueConversionError};
2
3use crate::error::MachineErrorType;
4
5pub trait Stack {
7 fn push_value(&mut self, value: Value) -> Result<(), MachineErrorType>;
9
10 fn pop_value(&mut self) -> Result<Value, MachineErrorType>;
12
13 fn peek_value(&mut self) -> Result<&mut Value, MachineErrorType>;
16
17 fn push<V>(&mut self, value: V) -> Result<(), MachineErrorType>
19 where
20 V: Into<Value>,
21 {
22 self.push_value(value.into())
23 }
24
25 fn pop<V>(&mut self) -> Result<V, MachineErrorType>
27 where
28 V: TryFromValue,
29 {
30 let raw = self.pop_value()?;
31 Ok(TryFromValue::try_from_value(raw)?)
32 }
33
34 fn peek<V>(&mut self) -> Result<&mut V, MachineErrorType>
36 where
37 V: ?Sized,
38 Value: TryAsMut<V, Error = ValueConversionError>,
39 {
40 let raw = self.peek_value()?;
41 Ok(raw.try_as_mut()?)
42 }
43}