Skip to main content

rib/
value.rs

1#[derive(Debug, Clone, PartialEq)]
2pub enum Value {
3    Bool(bool),
4    U8(u8),
5    U16(u16),
6    U32(u32),
7    U64(u64),
8    S8(i8),
9    S16(i16),
10    S32(i32),
11    S64(i64),
12    F32(f32),
13    F64(f64),
14    Char(char),
15    String(String),
16    List(Vec<Value>),
17    Tuple(Vec<Value>),
18    Record(Vec<Value>),
19    Variant {
20        case_idx: u32,
21        case_value: Option<Box<Value>>,
22    },
23    Enum(u32),
24    Flags(Vec<bool>),
25    Option(Option<Box<Value>>),
26    Result(Result<Option<Box<Value>>, Option<Box<Value>>>),
27    Handle {
28        uri: String,
29        resource_id: u64,
30    },
31}
32
33impl std::fmt::Display for Value {
34    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35        match self {
36            Value::Bool(v) => write!(f, "{v}"),
37            Value::U8(v) => write!(f, "{v}"),
38            Value::U16(v) => write!(f, "{v}"),
39            Value::U32(v) => write!(f, "{v}"),
40            Value::U64(v) => write!(f, "{v}"),
41            Value::S8(v) => write!(f, "{v}"),
42            Value::S16(v) => write!(f, "{v}"),
43            Value::S32(v) => write!(f, "{v}"),
44            Value::S64(v) => write!(f, "{v}"),
45            Value::F32(v) => write!(f, "{v}"),
46            Value::F64(v) => write!(f, "{v}"),
47            Value::Char(v) => write!(f, "'{v}'"),
48            Value::String(v) => write!(f, "\"{v}\""),
49            Value::List(values) => {
50                write!(f, "[")?;
51                for (i, v) in values.iter().enumerate() {
52                    if i > 0 {
53                        write!(f, ", ")?;
54                    }
55                    write!(f, "{v}")?;
56                }
57                write!(f, "]")
58            }
59            Value::Tuple(values) => {
60                write!(f, "(")?;
61                for (i, v) in values.iter().enumerate() {
62                    if i > 0 {
63                        write!(f, ", ")?;
64                    }
65                    write!(f, "{v}")?;
66                }
67                write!(f, ")")
68            }
69            Value::Record(values) => {
70                write!(f, "{{")?;
71                for (i, v) in values.iter().enumerate() {
72                    if i > 0 {
73                        write!(f, ", ")?;
74                    }
75                    write!(f, "{v}")?;
76                }
77                write!(f, "}}")
78            }
79            Value::Variant {
80                case_idx,
81                case_value,
82            } => {
83                write!(f, "variant#{case_idx}")?;
84                if let Some(v) = case_value {
85                    write!(f, "({v})")?;
86                }
87                Ok(())
88            }
89            Value::Enum(idx) => write!(f, "enum#{idx}"),
90            Value::Flags(flags) => {
91                write!(f, "{{")?;
92                let mut first = true;
93                for (i, set) in flags.iter().enumerate() {
94                    if *set {
95                        if !first {
96                            write!(f, ", ")?;
97                        }
98                        write!(f, "flag#{i}")?;
99                        first = false;
100                    }
101                }
102                write!(f, "}}")
103            }
104            Value::Option(None) => write!(f, "none"),
105            Value::Option(Some(v)) => write!(f, "some({v})"),
106            Value::Result(Ok(Some(v))) => write!(f, "ok({v})"),
107            Value::Result(Ok(None)) => write!(f, "ok"),
108            Value::Result(Err(Some(v))) => write!(f, "err({v})"),
109            Value::Result(Err(None)) => write!(f, "err"),
110            Value::Handle { uri, resource_id } => write!(f, "handle({uri}#{resource_id})"),
111        }
112    }
113}