1mod serializer;
2
3use self::serializer::*;
4use crate::*;
5
6#[derive(Debug)]
7pub enum Value {
8 None,
10
11 Bool(bool),
13
14 Char(char),
16
17 F32(f32),
19
20 F64(f64),
22
23 U8(u8),
25
26 I8(i8),
28
29 U16(u16),
31
32 I16(i16),
34
35 U32(u32),
37
38 I32(i32),
40
41 U64(u64),
43
44 I64(i64),
46
47 U128(u128),
49
50 I128(i128),
52
53 Usize(usize),
55
56 Isize(isize),
58
59 String(String),
61
62 Array(Vec<Value>),
64
65 Map(Vec<(Value, Value)>),
67}
68
69impl Value {
70 pub fn as_struct_named_field(&self, name: &str) -> Option<&Self> {
71 let fields = if let Self::Map(fields) = self {
72 fields
73 } else {
74 return None;
75 };
76
77 fields.iter().find_map(|(name2, value)| {
78 if let Value::String(name2) = name2 {
79 if name2 == name {
80 return Some(value);
81 }
82 }
83
84 None
85 })
86 }
87
88 pub fn as_struct_unnamed_field(&self, idx: usize) -> Option<&Self> {
89 match self {
90 Self::Array(items) => items.get(idx),
91 Self::Map(fields) => fields.get(idx).map(|(_, value)| value),
92 _ => None,
93 }
94 }
95}
96
97impl Default for Value {
98 fn default() -> Self {
99 Self::None
100 }
101}
102
103impl<S> From<&S> for Value
104where
105 S: Serialize,
106{
107 fn from(value: &S) -> Self {
108 value.serialize(ValueSerializer::default()).unwrap()
110 }
111}