#![doc = include_str!("../README.md")]
#![warn(missing_docs)]
#![allow(clippy::mutable_key_type)]
mod error;
mod flatbuffers;
mod hashmap;
mod kind;
mod notification;
#[macro_use]
mod sql;
mod traits;
pub(crate) mod utils;
mod value;
mod variables;
pub use error::*;
pub use flatbuffers::*;
pub use hashmap::HashMap;
pub use kind::*;
pub use notification::*;
pub use sql::{SqlFormat, ToSql, write_sql};
pub use surrealdb_types_derive::{SurrealValue, kind};
pub use traits::*;
pub use utils::either::*;
pub use value::*;
pub use variables::*;
#[macro_export]
macro_rules! object {
() => {
$crate::Object::new()
};
($($key:tt: $value:expr),* $(,)?) => {
{
let mut obj = $crate::Object::new();
$(
$crate::object!(@insert obj, $key: $crate::SurrealValue::into_value($value));
)*
obj
}
};
(@insert $obj:expr, $key:ident: $value:expr) => {
$obj.insert(stringify!($key).to_string(), $value);
};
(@insert $obj:expr, $key:literal: $value:expr) => {
$obj.insert($key.to_string(), $value);
};
}
#[macro_export]
macro_rules! set {
($($value:expr),* $(,)?) => {
$crate::Set::from(vec![$($value),*])
};
}
#[macro_export]
macro_rules! vars {
($($key:tt: $value:expr),* $(,)?) => {
$crate::Variables::from($crate::object! {
$($key: $value),*
})
};
}
#[macro_export]
macro_rules! array {
[] => {
$crate::Array::new()
};
[$($value:expr),* $(,)?] => {
{
let mut arr = $crate::Array::new();
$(
arr.push($crate::Value::from_t($value));
)*
arr
}
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_object_macro() {
let empty = object! {};
assert_eq!(empty.0.len(), 0);
let _ = Value::None.is_bool();
let obj1 = object! {
name: "John".to_string(),
age: 30,
};
assert_eq!(obj1.0.get("name"), Some(&Value::String("John".to_string())));
assert_eq!(obj1.0.get("age"), Some(&Value::Number(30.into())));
let obj2 = object! {
"first-name": "John".to_string(),
"last-name": "Doe".to_string(),
};
assert_eq!(obj2.0.get("first-name"), Some(&Value::String("John".to_string())));
assert_eq!(obj2.0.get("last-name"), Some(&Value::String("Doe".to_string())));
let obj3 = object! {
name: "John".to_string(),
"last-name": "Doe".to_string(),
age: 30,
"user-id": 12345,
active: true,
};
assert_eq!(obj3.0.get("name"), Some(&Value::String("John".to_string())));
assert_eq!(obj3.0.get("last-name"), Some(&Value::String("Doe".to_string())));
assert_eq!(obj3.0.get("age"), Some(&Value::Number(30.into())));
assert_eq!(obj3.0.get("user-id"), Some(&Value::Number(12345.into())));
assert_eq!(obj3.0.get("active"), Some(&Value::Bool(true)));
let obj4 = object! {
name: "Alice".to_string(),
"last-name": "Smith".to_string(),
};
assert_eq!(obj4.0.get("name"), Some(&Value::String("Alice".to_string())));
assert_eq!(obj4.0.get("last-name"), Some(&Value::String("Smith".to_string())));
}
#[test]
fn test_array_macro() {
let empty = array![];
assert_eq!(empty.len(), 0);
let arr1 = array![1, 2, 3];
assert_eq!(arr1.len(), 3);
assert_eq!(arr1[0], Value::Number(1.into()));
assert_eq!(arr1[1], Value::Number(2.into()));
assert_eq!(arr1[2], Value::Number(3.into()));
let arr2 = array!["hello".to_string(), 42, true];
assert_eq!(arr2.len(), 3);
assert_eq!(arr2[0], Value::String("hello".to_string()));
assert_eq!(arr2[1], Value::Number(42.into()));
assert_eq!(arr2[2], Value::Bool(true));
let arr3 = array!["a".to_string(), "b".to_string()];
assert_eq!(arr3.len(), 2);
assert_eq!(arr3[0], Value::String("a".to_string()));
assert_eq!(arr3[1], Value::String("b".to_string()));
let nested_obj = object! { name: "John".to_string(), age: 30 };
let arr4 = array![1, nested_obj.clone(), "end".to_string()];
assert_eq!(arr4.len(), 3);
assert_eq!(arr4[0], Value::Number(1.into()));
assert_eq!(arr4[1], Value::Object(nested_obj));
assert_eq!(arr4[2], Value::String("end".to_string()));
}
}