pg_upsert/
macros.rs

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}