1#![doc = include_str!("../README.md")]
2#![warn(missing_docs)]
3#![allow(clippy::mutable_key_type)]
4
5mod error;
6mod flatbuffers;
7mod hashmap;
8mod kind;
9mod notification;
10#[macro_use]
11mod sql;
12mod traits;
13pub(crate) mod utils;
14mod value;
15mod variables;
16
17pub use error::*;
18pub use flatbuffers::*;
19pub use hashmap::HashMap;
20pub use kind::*;
21pub use notification::*;
22pub use sql::{SqlFormat, ToSql, write_sql};
23pub use surrealdb_types_derive::{SurrealValue, kind};
25pub use traits::*;
26pub use utils::either::*;
27pub use value::*;
28pub use variables::*;
29
30#[macro_export]
46macro_rules! object {
47 () => {
49 $crate::Object::new()
50 };
51
52 ($($key:tt: $value:expr),* $(,)?) => {
54 {
55 let mut obj = $crate::Object::new();
56 $(
57 $crate::object!(@insert obj, $key: $crate::SurrealValue::into_value($value));
58 )*
59 obj
60 }
61 };
62
63 (@insert $obj:expr, $key:ident: $value:expr) => {
65 $obj.insert(stringify!($key).to_string(), $value);
66 };
67
68 (@insert $obj:expr, $key:literal: $value:expr) => {
70 $obj.insert($key.to_string(), $value);
71 };
72}
73
74#[macro_export]
91macro_rules! set {
92 ($($value:expr),* $(,)?) => {
93 $crate::Set::from(vec![$($value),*])
94 };
95}
96
97#[macro_export]
115macro_rules! vars {
116 ($($key:tt: $value:expr),* $(,)?) => {
117 $crate::Variables::from($crate::object! {
118 $($key: $value),*
119 })
120 };
121}
122
123#[macro_export]
136macro_rules! array {
137 [] => {
139 $crate::Array::new()
140 };
141
142 [$($value:expr),* $(,)?] => {
144 {
145 let mut arr = $crate::Array::new();
146 $(
147 arr.push($crate::Value::from_t($value));
148 )*
149 arr
150 }
151 };
152}
153
154#[cfg(test)]
191mod tests {
192 use super::*;
193
194 #[test]
195 fn test_object_macro() {
196 let empty = object! {};
198 assert_eq!(empty.0.len(), 0);
199
200 let _ = Value::None.is_bool();
201
202 let obj1 = object! {
204 name: "John".to_string(),
205 age: 30,
206 };
207 assert_eq!(obj1.0.get("name"), Some(&Value::String("John".to_string())));
208 assert_eq!(obj1.0.get("age"), Some(&Value::Number(30.into())));
209
210 let obj2 = object! {
212 "first-name": "John".to_string(),
213 "last-name": "Doe".to_string(),
214 };
215 assert_eq!(obj2.0.get("first-name"), Some(&Value::String("John".to_string())));
216 assert_eq!(obj2.0.get("last-name"), Some(&Value::String("Doe".to_string())));
217
218 let obj3 = object! {
220 name: "John".to_string(),
221 "last-name": "Doe".to_string(),
222 age: 30,
223 "user-id": 12345,
224 active: true,
225 };
226 assert_eq!(obj3.0.get("name"), Some(&Value::String("John".to_string())));
227 assert_eq!(obj3.0.get("last-name"), Some(&Value::String("Doe".to_string())));
228 assert_eq!(obj3.0.get("age"), Some(&Value::Number(30.into())));
229 assert_eq!(obj3.0.get("user-id"), Some(&Value::Number(12345.into())));
230 assert_eq!(obj3.0.get("active"), Some(&Value::Bool(true)));
231
232 let obj4 = object! {
234 name: "Alice".to_string(),
235 "last-name": "Smith".to_string(),
236 };
237 assert_eq!(obj4.0.get("name"), Some(&Value::String("Alice".to_string())));
238 assert_eq!(obj4.0.get("last-name"), Some(&Value::String("Smith".to_string())));
239 }
240
241 #[test]
242 fn test_array_macro() {
243 let empty = array![];
245 assert_eq!(empty.len(), 0);
246
247 let arr1 = array![1, 2, 3];
249 assert_eq!(arr1.len(), 3);
250 assert_eq!(arr1[0], Value::Number(1.into()));
251 assert_eq!(arr1[1], Value::Number(2.into()));
252 assert_eq!(arr1[2], Value::Number(3.into()));
253
254 let arr2 = array!["hello".to_string(), 42, true];
256 assert_eq!(arr2.len(), 3);
257 assert_eq!(arr2[0], Value::String("hello".to_string()));
258 assert_eq!(arr2[1], Value::Number(42.into()));
259 assert_eq!(arr2[2], Value::Bool(true));
260
261 let arr3 = array!["a".to_string(), "b".to_string()];
263 assert_eq!(arr3.len(), 2);
264 assert_eq!(arr3[0], Value::String("a".to_string()));
265 assert_eq!(arr3[1], Value::String("b".to_string()));
266
267 let nested_obj = object! { name: "John".to_string(), age: 30 };
269 let arr4 = array![1, nested_obj.clone(), "end".to_string()];
270 assert_eq!(arr4.len(), 3);
271 assert_eq!(arr4[0], Value::Number(1.into()));
272 assert_eq!(arr4[1], Value::Object(nested_obj));
273 assert_eq!(arr4[2], Value::String("end".to_string()));
274 }
275}