1use vector_lib::config::LogNamespace;
2use vector_lib::configurable::configurable_component;
3
4pub(crate) use crate::schema::Definition;
5
6#[configurable_component]
8#[derive(Clone, Copy, Debug, Eq, PartialEq)]
9#[serde(default, deny_unknown_fields)]
10pub struct Options {
11 #[serde(default = "default_enabled")]
13 pub enabled: bool,
14
15 #[serde(default = "default_validation")]
17 pub validation: bool,
18
19 pub log_namespace: Option<bool>,
21}
22
23impl Options {
24 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 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 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}