vector/config/
schema.rs

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