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}