Skip to main content

rbs/
lib.rs

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    /// return array/map/string's length
44    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
64/// is debug mode
65pub 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        // 使用手动构建的方式来测试嵌套结构
88        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        // 验证结构正确
106        assert!(value.is_map());
107        let map = value.as_map().unwrap();
108        assert_eq!(map["id"].as_i64().unwrap(), 1);
109        
110        // 验证嵌套的user结构
111        assert!(map["user"].is_map());
112        let user = map["user"].as_map().unwrap();
113        assert_eq!(user["name"].as_str().unwrap(), "Alice");
114        
115        // 验证嵌套的address结构
116        assert!(user["address"].is_map());
117        let address = user["address"].as_map().unwrap();
118        assert_eq!(address["city"].as_str().unwrap(), "Beijing");
119        
120        // 验证嵌套的street结构
121        assert!(address["street"].is_map());
122        let street = address["street"].as_map().unwrap();
123        assert_eq!(street["number"].as_i64().unwrap(), 123);
124    }
125}