vector_core/event/util/log/
keys.rs

1use super::all_fields;
2use crate::event::{KeyString, ObjectMap};
3
4/// Iterates over all paths in form `a.b[0].c[1]` in alphabetical order.
5/// It is implemented as a wrapper around `all_fields` to reduce code
6/// duplication.
7pub fn keys(fields: &ObjectMap) -> impl Iterator<Item = KeyString> + '_ {
8    all_fields(fields).map(|(k, _)| k)
9}
10
11#[cfg(test)]
12mod test {
13    use serde_json::json;
14
15    use super::{super::test::fields_from_json, *};
16
17    #[test]
18    fn keys_simple() {
19        let fields = fields_from_json(json!({
20            "field2": 3,
21            "field1": 4,
22            "field3": 5
23        }));
24        let expected: Vec<_> = vec!["field1", "field2", "field3"]
25            .into_iter()
26            .map(KeyString::from)
27            .collect();
28
29        let collected: Vec<_> = keys(&fields).collect();
30        assert_eq!(collected, expected);
31    }
32
33    #[test]
34    fn keys_nested() {
35        let fields = fields_from_json(json!({
36            "a": {
37                "b": {
38                    "c": 5
39                },
40                "a": 4,
41                "array": [null, 3, {
42                    "x": 1
43                }, [2]]
44            }
45        }));
46        let expected: Vec<_> = vec![
47            "a.a",
48            "a.array[0]",
49            "a.array[1]",
50            "a.array[2].x",
51            "a.array[3][0]",
52            "a.b.c",
53        ]
54        .into_iter()
55        .map(KeyString::from)
56        .collect();
57
58        let collected: Vec<_> = keys(&fields).collect();
59        assert_eq!(collected, expected);
60    }
61}