xee_interpreter/stack/
value.rs

1// the stack::Value is either a sequence or absent
2
3use crate::error;
4
5use crate::sequence;
6
7#[derive(Debug, Clone, PartialEq)]
8pub enum Value {
9    Absent,
10    Sequence(sequence::Sequence),
11}
12
13// a static assertion to ensure that Value never grows in size
14#[cfg(target_arch = "x86_64")]
15static_assertions::assert_eq_size!(Value, [u8; 24]);
16
17impl Value {
18    pub(crate) fn is_absent(&self) -> bool {
19        matches!(self, Value::Absent)
20    }
21}
22
23impl TryFrom<Value> for sequence::Sequence {
24    type Error = error::Error;
25
26    fn try_from(value: Value) -> Result<Self, Self::Error> {
27        match value {
28            Value::Absent => Err(error::Error::XPDY0002),
29            Value::Sequence(sequence) => Ok(sequence),
30        }
31    }
32}
33
34impl TryFrom<&Value> for sequence::Sequence {
35    type Error = error::Error;
36
37    fn try_from(value: &Value) -> Result<Self, Self::Error> {
38        match value {
39            Value::Absent => Err(error::Error::XPDY0002),
40            Value::Sequence(sequence) => Ok(sequence.clone()),
41        }
42    }
43}
44
45impl<T> From<T> for Value
46where
47    T: Into<sequence::Sequence>,
48{
49    fn from(t: T) -> Self {
50        let sequence: sequence::Sequence = t.into();
51        Value::Sequence(sequence)
52    }
53}