#[macro_export]
macro_rules! dot {
($seq:expr) => {
const {
$crate::causal_context::Dot::mint(
$crate::causal_context::Identifier::new(1, 1),
$seq,
)
}
};
($node:expr, $seq:expr) => {
const {
$crate::causal_context::Dot::mint(
$crate::causal_context::Identifier::new($node, 1),
$seq,
)
}
};
($node:expr, $app:expr, $seq:expr) => {
const {
$crate::causal_context::Dot::mint(
$crate::causal_context::Identifier::new($node, $app),
$seq,
)
}
};
}
#[macro_export]
macro_rules! crdt_map_literal {
($($k:literal => $v:tt),*) => {
$crate::crdt_literal!( { $( $k => $v ),* } ).map
};
}
#[macro_export]
macro_rules! crdt_literal {
({$($k:literal => $v:tt),*}) => {
{
let mut map = $crate::OrMap::<String, $crate::crdts::NoExtensionTypes>::default();
$( { $crate::crdt_literal!(map_insert, map, $k, $v); } )*
$crate::crdts::TypeVariantValue {
map,
..$crate::crdts::TypeVariantValue::<$crate::crdts::NoExtensionTypes>::default()
}
}
};
([$($v:tt),*]) => {
{
let mut array = $crate::OrArray::<$crate::crdts::NoExtensionTypes>::default();
$( $crate::crdt_literal!(array_element, array, $v); )*
$crate::crdts::TypeVariantValue {
array,
..$crate::crdts::TypeVariantValue::<$crate::crdts::NoExtensionTypes>::default()
}
}
};
( ($($v:expr, $dot:expr $(;)? )* ) ) => {
{
let mut reg = $crate::crdts::mvreg::MvReg::default();
$( reg.push($dot, $v); )*
$crate::crdts::TypeVariantValue {
reg,
..$crate::crdts::TypeVariantValue::<$crate::crdts::NoExtensionTypes>::default()
}
}
};
(map_insert, $temp:ident, $k:literal , $v: tt) => {
$temp.insert($k.into(), $crate::crdt_literal!($v));
};
(array_element, $temp:ident, ($v:tt, $uid: expr, $dot1:expr, $dot2:expr, $pos_f64:expr)) => {
let val = $crate::crdt_literal!($v);
$temp.insert_raw($crate::crdts::orarray::Uid::from($uid), std::iter::once(($dot1,$dot2,$pos_f64)), val);
};
}
#[macro_export]
macro_rules! crdt_map_store {
($($k:literal => $v:tt),*) => {
{
use $crate::{DotStore, CausalDotStore};
let ormap = $crate::crdt_map_literal!($($k => $v),*);
let dots = ormap.dots();
CausalDotStore {
store: ormap,
context: dots
}
}
}
}
#[cfg(test)]
mod tests {
use crate::enable_determinism;
use insta::assert_debug_snapshot;
#[test]
fn crdt_map_literal_macro() {
enable_determinism();
let map = crdt_map_literal! {
"field_x" => ("Hello", dot!(1,2)),
"field_y" => ("World", dot!(1,3)),
"field_z" => {
"field_x" => ("Nested", dot!(1,4)),
"field_y" => ("Nested", dot!(1,5))
}
};
assert_debug_snapshot!(map);
}
#[test]
fn crdt_map_store_macro() {
enable_determinism();
let map = crdt_map_store! {
"field_x" => ("Hello", dot!(1,2)),
"field_y" => ("World", dot!(1,3)),
"field_z" => {
"field_x" => ("Nested", dot!(1,4)),
"field_y" => ("Nested", dot!(1,5))
}
};
assert_debug_snapshot!(map);
}
#[test]
fn crdt_map_literal_macro_array() {
enable_determinism();
let map = crdt_map_literal! {
"field_x" => ("Hello", dot!(1)),
"field_y" => ("World", dot!(2)),
"field_z" => [
(("Banana", dot!(3)), dot!(4), dot!(5), dot!(6), 42.0),
(("Cantaloupe", dot!(7)), dot!(8), dot!(9), dot!(10), 43.0)
]
};
assert_debug_snapshot!(map);
}
}