1#[macro_export]
2macro_rules! fields {
3 ($($name:expr => $value:expr),* $(,)?) => {
4 vec![
5 $(
6 $crate::Field::new($name, $value),
7 )*
8 ]
9 };
10}
11
12#[cfg(test)]
13mod tests {
14 use crate::types::{Field, FieldValue};
15
16 #[test]
17 fn test_fields_macro_basic() {
18 let fields: Vec<Field> = fields![
19 "id" => 1_i32,
20 "name" => "test",
21 ];
22
23 assert_eq!(fields.len(), 2);
24 assert_eq!(fields[0].name, "id");
25 assert_eq!(fields[1].name, "name");
26
27 match &fields[0].value {
28 FieldValue::Int32(v) => assert_eq!(*v, 1),
29 _ => panic!("expected Int32"),
30 }
31
32 match &fields[1].value {
33 FieldValue::String(v) => assert_eq!(v, "test"),
34 _ => panic!("expected String"),
35 }
36 }
37
38 #[test]
39 fn test_fields_macro_with_options() {
40 let fields: Vec<Field> = fields![
41 "id" => 1_i64,
42 "description" => None::<String>,
43 "active" => Some(true),
44 ];
45
46 assert_eq!(fields.len(), 3);
47
48 match &fields[1].value {
49 FieldValue::Null => {}
50 _ => panic!("expected Null"),
51 }
52
53 match &fields[2].value {
54 FieldValue::Bool(v) => assert!(*v),
55 _ => panic!("expected Bool"),
56 }
57 }
58
59 #[test]
60 fn test_fields_macro_all_types() {
61 let fields: Vec<Field> = fields![
62 "int32" => 42_i32,
63 "int64" => 42_i64,
64 "float32" => 42.5_f32,
65 "float64" => 42.5_f64,
66 "bool" => true,
67 "string" => "hello".to_string(),
68 "str" => "world",
69 "bytes" => vec![1_u8, 2, 3],
70 ];
71
72 assert_eq!(fields.len(), 8);
73 }
74
75 #[test]
76 fn test_fields_macro_empty() {
77 let fields: Vec<Field> = fields![];
78 assert!(fields.is_empty());
79 }
80
81 #[test]
82 fn test_fields_macro_trailing_comma() {
83 let fields: Vec<Field> = fields![
84 "id" => 1_i32,
85 "name" => "test",
86 ];
87 assert_eq!(fields.len(), 2);
88 }
89}