cbor_no_std/
value.rs

1extern crate core;
2extern crate alloc;
3use alloc::string::String;
4use alloc::vec::Vec;
5use alloc::collections::btree_map::BTreeMap;
6use ser::{Serializer, Serialize};
7
8#[derive(Debug, PartialEq, PartialOrd, Ord, Eq, Clone)]
9pub enum Value {
10    Null,
11    Int(u64),
12    NegativeInt(u64),
13    String(String),
14    Bytes(Vec<u8>),
15    Text(String),
16    Array(Vec<Value>),
17    Map(BTreeMap<Value, Value>),
18}
19
20impl Serialize for Value {
21    fn serialize<S>(&mut self, serializer: &mut S) where S: Serializer {
22        match *self {
23            Value::Int(n) => serializer.serialize_unsigned(n as u64, 0),
24            Value::Bytes(ref bytes) => serializer.serialize_bytes(bytes.to_vec()),
25            Value::String(ref string) => serializer.serialize_string(string),
26            Value::Array(ref mut array) => {
27                serializer.serialize_seq(array.len());
28
29                for value in array {
30                    value.serialize(serializer);
31                }
32            },
33            Value::Map(ref mut map) => {
34                serializer.serialize_map(map.len());
35                for(key, value) in map {
36                    key.clone().serialize(serializer);
37                    value.serialize(serializer);
38                }
39            },
40            Value::Null => serializer.serialize_simple(22),
41            _ => unreachable!(),
42        }
43    }
44}
45
46impl Value {
47    pub fn as_array(&self) -> Option<&Vec<Value>> {
48        if let Value::Array(ref v) = *self {
49            Some(v)
50        } else {
51            None
52        }
53    }
54
55    pub fn as_array_mut(&mut self) -> Option<&mut Vec<Value>> {
56        if let Value::Array(ref mut v) = *self {
57            Some(v)
58        } else {
59            None
60        }
61    }
62
63    pub fn as_bytes(&self) -> Option<&Vec<u8>> {
64        if let Value::Bytes(ref v) = *self {
65            Some(v)
66        } else {
67            None
68        }
69    }
70
71    pub fn as_bytes_mut(&mut self) -> Option<&mut Vec<u8>> {
72        if let Value::Bytes(ref mut v) = *self {
73            Some(v)
74        } else {
75            None
76        }
77    }
78
79    pub fn as_string(&self) -> Option<&String> {
80        if let Value::String(ref v) = *self {
81            Some(v)
82        } else {
83            None
84        }
85    }
86
87    pub fn as_string_mut(&mut self) -> Option<&mut String> {
88        if let Value::String(ref mut v) = *self {
89            Some(v)
90        } else {
91            None
92        }
93    }
94
95    pub fn as_int(&self) -> Option<u64> {
96        match *self {
97            Value::Int(n) => Some(n),
98            _ => None,
99        }
100    }
101
102    pub fn as_map(&self) -> Option<&BTreeMap<Value, Value>> {
103        if let Value::Map(ref v) = *self {
104            Some(v)
105        } else {
106            None
107        }
108    }
109
110    pub fn as_map_mut(&mut self) -> Option<&BTreeMap<Value, Value>> {
111        if let Value::Map(ref mut v) = *self {
112            Some(v)
113        } else {
114            None
115        }
116    }
117}
118
119impl From<Value> for BTreeMap<Value, Value> {
120    fn from(mut value: Value) -> BTreeMap<Value, Value> {
121        value.as_map_mut().unwrap().clone()
122    }
123}
124
125impl From<()> for Value {
126    fn from(_value: ()) -> Value {
127        Value::Null
128    }
129}
130
131impl From<u32> for Value {
132    fn from(value: u32) -> Value {
133        Value::Int(value as u64)
134    }
135}
136
137impl From<u64> for Value {
138    fn from(value: u64) -> Value {
139        Value::Int(value as u64)
140    }
141}
142
143impl From<Vec<u8>> for Value {
144    fn from(value: Vec<u8>) -> Value {
145        Value::Bytes(value)
146    }
147}
148
149impl From<BTreeMap<Value, Value>> for Value {
150    fn from(map: BTreeMap<Value, Value>) -> Value {
151        Value::Map(map)
152    }
153}