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