1#[macro_use]
2extern crate serde;
3extern crate core;
4
5pub mod index;
6pub mod value;
7
8mod value_serde;
9mod error;
10mod macros;
11pub use crate::error::Error;
12pub use value_serde::{from_value, from_value_ref};
13pub use value_serde::{value, value_def};
14pub use value_serde::{value as to_value, value_def as to_value_def};
15pub use value::Value;
16
17impl Value {
18 pub fn into_ext(self, name: &'static str) -> Self {
19 match self {
20 Value::Ext(_, _) => self,
21 _ => Value::Ext(name, Box::new(self)),
22 }
23 }
24
25 pub fn is_empty(&self) -> bool {
26 match self {
27 Value::Null => true,
28 Value::Bool(_) => false,
29 Value::I32(_) => false,
30 Value::I64(_) => false,
31 Value::U32(_) => false,
32 Value::U64(_) => false,
33 Value::F32(_) => false,
34 Value::F64(_) => false,
35 Value::String(v) => v.is_empty(),
36 Value::Binary(v) => v.is_empty(),
37 Value::Array(v) => v.is_empty(),
38 Value::Map(v) => v.is_empty(),
39 Value::Ext(_, v) => v.is_empty(),
40 }
41 }
42
43 pub fn len(&self) -> usize {
45 match self {
46 Value::Null => 0,
47 Value::Bool(_) => 0,
48 Value::I32(_) => 0,
49 Value::I64(_) => 0,
50 Value::U32(_) => 0,
51 Value::U64(_) => 0,
52 Value::F32(_) => 0,
53 Value::F64(_) => 0,
54 Value::String(v) => v.len(),
55 Value::Binary(v) => v.len(),
56 Value::Array(v) => v.len(),
57 Value::Map(v) => v.len(),
58 Value::Ext(_, v) => v.len(),
59 }
60 }
61}
62
63
64pub fn is_debug_mode() -> bool {
66 if cfg!(debug_assertions) {
67 #[cfg(feature = "debug_mode")]
68 {
69 true
70 }
71 #[cfg(not(feature = "debug_mode"))]
72 {
73 false
74 }
75 } else {
76 false
77 }
78}
79
80#[cfg(test)]
81mod test_utils {
82 use crate::value::map::ValueMap;
83 use crate::Value;
84
85 #[test]
86 fn test_nested_structure() {
87 let mut street_map = ValueMap::new();
89 street_map.insert("number".into(), 123.into());
90
91 let mut address_map = ValueMap::new();
92 address_map.insert("city".into(), "Beijing".into());
93 address_map.insert("street".into(), Value::Map(street_map));
94
95 let mut user_map = ValueMap::new();
96 user_map.insert("name".into(), "Alice".into());
97 user_map.insert("address".into(), Value::Map(address_map));
98
99 let mut root_map = ValueMap::new();
100 root_map.insert("id".into(), 1.into());
101 root_map.insert("user".into(), Value::Map(user_map));
102
103 let value = Value::Map(root_map);
104
105 assert!(value.is_map());
107 let map = value.as_map().unwrap();
108 assert_eq!(map["id"].as_i64().unwrap(), 1);
109
110 assert!(map["user"].is_map());
112 let user = map["user"].as_map().unwrap();
113 assert_eq!(user["name"].as_str().unwrap(), "Alice");
114
115 assert!(user["address"].is_map());
117 let address = user["address"].as_map().unwrap();
118 assert_eq!(address["city"].as_str().unwrap(), "Beijing");
119
120 assert!(address["street"].is_map());
122 let street = address["street"].as_map().unwrap();
123 assert_eq!(street["number"].as_i64().unwrap(), 123);
124 }
125}