cbor_lite/
value.rs

1use std::collections::BTreeMap;
2use ser::{Serializer, Serialize};
3
4#[derive(Debug, PartialEq, PartialOrd, Ord, Eq, Clone)]
5pub enum Value {
6    Null,
7    Int(u32),
8    NegativeInt(u32),
9    String(String),
10    Bytes(Vec<u8>),
11    Text(String),
12    Array(Vec<Value>),
13    Map(BTreeMap<String, Value>),
14}
15
16impl Serialize for Value {
17    fn serialize<S>(&mut self, serializer: &mut S) where S: Serializer {
18        match *self {
19            Value::Int(n) => serializer.serialize_unsigned(n as usize, 0),
20            Value::Bytes(ref bytes) => serializer.serialize_bytes(bytes.to_vec()),
21            Value::String(ref string) => serializer.serialize_string(string),
22            Value::Array(ref mut array) => {
23                serializer.serialize_seq(array.len());
24
25                for value in array {
26                    value.serialize(serializer);
27                }
28            },
29            Value::Map(ref mut map) => {
30                serializer.serialize_map(map.len());
31                for(key, value) in map {
32                    serializer.serialize_string(key);
33                    value.serialize(serializer);
34                }
35            },
36            Value::Null => serializer.serialize_simple(22),
37            _ => unreachable!(),
38        }
39    }
40}
41
42impl Value {
43    pub fn as_array(&self) -> Option<&Vec<Value>> {
44        if let Value::Array(ref v) = *self {
45            Some(v)
46        } else {
47            None
48        }
49    }
50
51    pub fn as_array_mut(&mut self) -> Option<&mut Vec<Value>> {
52        if let Value::Array(ref mut v) = *self {
53            Some(v)
54        } else {
55            None
56        }
57    }
58
59    pub fn as_bytes(&self) -> Option<&Vec<u8>> {
60        if let Value::Bytes(ref v) = *self {
61            Some(v)
62        } else {
63            None
64        }
65    }
66
67    pub fn as_bytes_mut(&mut self) -> Option<&mut Vec<u8>> {
68        if let Value::Bytes(ref mut v) = *self {
69            Some(v)
70        } else {
71            None
72        }
73    }
74
75    pub fn as_string(&self) -> Option<&String> {
76        if let Value::String(ref v) = *self {
77            Some(v)
78        } else {
79            None
80        }
81    }
82
83    pub fn as_string_mut(&mut self) -> Option<&mut String> {
84        if let Value::String(ref mut v) = *self {
85            Some(v)
86        } else {
87            None
88        }
89    }
90
91    pub fn as_int(&self) -> Option<u32> {
92        match *self {
93            Value::Int(n) => Some(n),
94            _ => None,
95        }
96    }
97
98    pub fn as_map(&self) -> Option<&BTreeMap<String, Value>> {
99        if let Value::Map(ref v) = *self {
100            Some(v)
101        } else {
102            None
103        }
104    }
105
106    pub fn as_map_mut(&mut self) -> Option<&BTreeMap<String, Value>> {
107        if let Value::Map(ref mut v) = *self {
108            Some(v)
109        } else {
110            None
111        }
112    }
113}