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}