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}