vector/config/
schema.rs

1use vector_lib::config::LogNamespace;
2use vector_lib::configurable::configurable_component;
3
4pub(crate) use crate::schema::Definition;
5
6/// Schema options.
7#[configurable_component]
8#[derive(Clone, Copy, Debug, Eq, PartialEq)]
9#[serde(default, deny_unknown_fields)]
10pub struct Options {
11    /// Whether or not schema is enabled.
12    #[serde(default = "default_enabled")]
13    pub enabled: bool,
14
15    /// Whether or not schema validation is enabled.
16    #[serde(default = "default_validation")]
17    pub validation: bool,
18
19    /// Whether or not to enable log namespacing.
20    pub log_namespace: Option<bool>,
21}
22
23impl Options {
24    /// Gets the value of the globally configured log namespace, or the default if it wasn't set.
25    pub fn log_namespace(self) -> LogNamespace {
26        self.log_namespace
27            .map_or(LogNamespace::Legacy, |use_vector_namespace| {
28                use_vector_namespace.into()
29            })
30    }
31
32    /// Merges two schema options together.
33    pub fn append(&mut self, with: Self, errors: &mut Vec<String>) {
34        if self.log_namespace.is_some()
35            && with.log_namespace.is_some()
36            && self.log_namespace != with.log_namespace
37        {
38            errors.push(
39                format!("conflicting values for 'log_namespace' found. Both {:?} and {:?} used in the same component",
40                        self.log_namespace(), with.log_namespace())
41            );
42        }
43        if let Some(log_namespace) = with.log_namespace {
44            self.log_namespace = Some(log_namespace);
45        }
46
47        // If either config enables these flags, it is enabled.
48        self.enabled |= with.enabled;
49        self.validation |= with.validation;
50    }
51}
52
53impl Default for Options {
54    fn default() -> Self {
55        Self {
56            enabled: default_enabled(),
57            validation: default_validation(),
58            log_namespace: None,
59        }
60    }
61}
62
63const fn default_enabled() -> bool {
64    false
65}
66
67const fn default_validation() -> bool {
68    false
69}
70
71#[cfg(test)]
72mod test {
73    use super::*;
74
75    #[test]
76    fn test_append() {
77        for (test, mut a, b, expected) in [
78            (
79                "enable log namespacing",
80                Options {
81                    enabled: false,
82                    validation: false,
83                    log_namespace: None,
84                },
85                Options {
86                    enabled: false,
87                    validation: false,
88                    log_namespace: Some(true),
89                },
90                Some(Options {
91                    enabled: false,
92                    validation: false,
93                    log_namespace: Some(true),
94                }),
95            ),
96            (
97                "log namespace conflict",
98                Options {
99                    enabled: false,
100                    validation: false,
101                    log_namespace: Some(false),
102                },
103                Options {
104                    enabled: false,
105                    validation: false,
106                    log_namespace: Some(true),
107                },
108                None,
109            ),
110            (
111                "enable schemas",
112                Options {
113                    enabled: false,
114                    validation: false,
115                    log_namespace: None,
116                },
117                Options {
118                    enabled: true,
119                    validation: false,
120                    log_namespace: None,
121                },
122                Some(Options {
123                    enabled: true,
124                    validation: false,
125                    log_namespace: None,
126                }),
127            ),
128            (
129                "enable sink requirements",
130                Options {
131                    enabled: false,
132                    validation: false,
133                    log_namespace: None,
134                },
135                Options {
136                    enabled: false,
137                    validation: true,
138                    log_namespace: None,
139                },
140                Some(Options {
141                    enabled: false,
142                    validation: true,
143                    log_namespace: None,
144                }),
145            ),
146        ] {
147            let mut errors = vec![];
148            a.append(b, &mut errors);
149            if errors.is_empty() {
150                assert_eq!(Some(a), expected, "result mismatch: {test}");
151            } else {
152                assert_eq!(
153                    errors.is_empty(),
154                    expected.is_some(),
155                    "error mismatch: {test}"
156                );
157            }
158        }
159    }
160}