1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#[macro_export]
macro_rules! collection {
    // map-like
    ($($k:expr => $v:expr),* $(,)?) => {{
        std::collections::HashMap::from([$(($k.into(), $v.into()),)*])
    }};
    // set-like
    ($($v:expr),* $(,)?) => {{
        core::convert::From::from([$($v,)*])
    }};
}

#[macro_export]
macro_rules! record {
    ("id" => $id:expr) => {{
        $crate::record::Record {
            id: $id.into(),
            fields: std::collections::HashMap::with_capacity(0)
        }
    }};
    ("id" => $id:expr, $($k:expr => $v:expr),* $(,)?) => {{
        $crate::record::Record {
            id: $id.into(),
            fields: std::collections::HashMap::from([$(($k.into(), $v.into()),)*])
        }
    }};
}

pub use collection;
pub use record;

#[cfg(test)]
macro_rules! cbor_buffer {
    ($($tokens:tt)*) => {{
        use ciborium::{ cbor, ser::into_writer };

        let mut output: Vec<u8> = vec![];
        let value = cbor!($($tokens)*).expect("Failed to create cbor");
        into_writer(&value, &mut output).expect("Failed to serialize cbor");
        output
    }};
}

#[cfg(test)]
pub(crate) use cbor_buffer;

// Simple catch-all boxed error type
pub type StdError = Box<dyn std::error::Error>;