#[derive(Debug, Clone, PartialEq)]
pub enum Value {
Bool(bool),
U8(u8),
U16(u16),
U32(u32),
U64(u64),
S8(i8),
S16(i16),
S32(i32),
S64(i64),
F32(f32),
F64(f64),
Char(char),
String(String),
List(Vec<Value>),
Tuple(Vec<Value>),
Record(Vec<Value>),
Variant {
case_idx: u32,
case_value: Option<Box<Value>>,
},
Enum(u32),
Flags(Vec<bool>),
Option(Option<Box<Value>>),
Result(Result<Option<Box<Value>>, Option<Box<Value>>>),
Handle {
uri: String,
resource_id: u64,
},
}
impl std::fmt::Display for Value {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Value::Bool(v) => write!(f, "{v}"),
Value::U8(v) => write!(f, "{v}"),
Value::U16(v) => write!(f, "{v}"),
Value::U32(v) => write!(f, "{v}"),
Value::U64(v) => write!(f, "{v}"),
Value::S8(v) => write!(f, "{v}"),
Value::S16(v) => write!(f, "{v}"),
Value::S32(v) => write!(f, "{v}"),
Value::S64(v) => write!(f, "{v}"),
Value::F32(v) => write!(f, "{v}"),
Value::F64(v) => write!(f, "{v}"),
Value::Char(v) => write!(f, "'{v}'"),
Value::String(v) => write!(f, "\"{v}\""),
Value::List(values) => {
write!(f, "[")?;
for (i, v) in values.iter().enumerate() {
if i > 0 {
write!(f, ", ")?;
}
write!(f, "{v}")?;
}
write!(f, "]")
}
Value::Tuple(values) => {
write!(f, "(")?;
for (i, v) in values.iter().enumerate() {
if i > 0 {
write!(f, ", ")?;
}
write!(f, "{v}")?;
}
write!(f, ")")
}
Value::Record(values) => {
write!(f, "{{")?;
for (i, v) in values.iter().enumerate() {
if i > 0 {
write!(f, ", ")?;
}
write!(f, "{v}")?;
}
write!(f, "}}")
}
Value::Variant {
case_idx,
case_value,
} => {
write!(f, "variant#{case_idx}")?;
if let Some(v) = case_value {
write!(f, "({v})")?;
}
Ok(())
}
Value::Enum(idx) => write!(f, "enum#{idx}"),
Value::Flags(flags) => {
write!(f, "{{")?;
let mut first = true;
for (i, set) in flags.iter().enumerate() {
if *set {
if !first {
write!(f, ", ")?;
}
write!(f, "flag#{i}")?;
first = false;
}
}
write!(f, "}}")
}
Value::Option(None) => write!(f, "none"),
Value::Option(Some(v)) => write!(f, "some({v})"),
Value::Result(Ok(Some(v))) => write!(f, "ok({v})"),
Value::Result(Ok(None)) => write!(f, "ok"),
Value::Result(Err(Some(v))) => write!(f, "err({v})"),
Value::Result(Err(None)) => write!(f, "err"),
Value::Handle { uri, resource_id } => write!(f, "handle({uri}#{resource_id})"),
}
}
}