vector/components/validation/resources/
event.rs1use std::collections::HashMap;
2
3use bytes::BytesMut;
4use serde::Deserialize;
5use serde_json::Value;
6use snafu::Snafu;
7use tokio_util::codec::Encoder as _;
8use vector_lib::codecs::encoding::format::JsonSerializerOptions;
9
10use crate::codecs::Encoder;
11use vector_lib::codecs::{
12 encoding, JsonSerializer, LengthDelimitedEncoder, LogfmtSerializer, MetricTagValues,
13 NewlineDelimitedEncoder,
14};
15use vector_lib::event::{Event, LogEvent};
16
17#[derive(Clone, Debug, Deserialize)]
20#[serde(untagged)]
21pub enum RawTestEvent {
22 Passthrough(EventData),
24
25 AlternateEncoder { fail_encoding_of: EventData },
35
36 ResourceReject {
38 external_resource_rejects: EventData,
39 },
40}
41
42#[derive(Clone, Debug, Deserialize)]
43#[serde(rename_all = "snake_case")]
44pub enum EventData {
45 Log(String),
47 LogBuilder(HashMap<String, Value>),
49}
50
51impl EventData {
52 pub fn into_event(self) -> Event {
54 match self {
55 Self::Log(message) => Event::Log(LogEvent::from_bytes_legacy(&message.into())),
56 Self::LogBuilder(data) => {
57 let mut log_event = LogEvent::default();
58 for (k, v) in data {
59 log_event
60 .parse_path_and_insert(&k, v)
61 .unwrap_or_else(|_| panic!("Unable to build log event for {}", &k));
62 }
63 Event::Log(log_event)
64 }
65 }
66 }
67}
68
69#[derive(Clone, Debug, Deserialize)]
79#[serde(from = "RawTestEvent")]
80#[serde(untagged)]
81pub enum TestEvent {
82 Passthrough(Event),
84
85 FailWithAlternateEncoder(Event),
88
89 FailWithExternalResource(Event),
92}
93
94impl TestEvent {
95 #[allow(clippy::missing_const_for_fn)] pub fn into_event(self) -> Event {
97 match self {
98 Self::Passthrough(event) => event,
99 Self::FailWithAlternateEncoder(event) => event,
100 Self::FailWithExternalResource(event) => event,
101 }
102 }
103
104 pub const fn get_event(&mut self) -> &mut Event {
105 match self {
106 Self::Passthrough(event) => event,
107 Self::FailWithAlternateEncoder(event) => event,
108 Self::FailWithExternalResource(event) => event,
109 }
110 }
111
112 pub fn get(self) -> (bool, Event) {
114 match self {
115 Self::Passthrough(event) => (false, event),
116 Self::FailWithAlternateEncoder(event) => (true, event),
117 Self::FailWithExternalResource(event) => (true, event),
118 }
119 }
120
121 pub const fn should_fail(&self) -> bool {
123 match self {
124 Self::Passthrough(_) => false,
125 Self::FailWithAlternateEncoder(_) | Self::FailWithExternalResource(_) => true,
126 }
127 }
128
129 pub const fn should_reject(&self) -> bool {
132 match self {
133 Self::Passthrough(_) | Self::FailWithAlternateEncoder(_) => false,
134 Self::FailWithExternalResource(_) => true,
135 }
136 }
137}
138
139#[derive(Clone, Debug, Eq, PartialEq, Snafu)]
140pub enum RawTestEventParseError {}
141
142impl From<RawTestEvent> for TestEvent {
143 fn from(other: RawTestEvent) -> Self {
144 match other {
145 RawTestEvent::Passthrough(event_data) => {
146 TestEvent::Passthrough(event_data.into_event())
147 }
148 RawTestEvent::AlternateEncoder {
149 fail_encoding_of: event_data,
150 } => TestEvent::FailWithAlternateEncoder(event_data.into_event()),
151 RawTestEvent::ResourceReject {
152 external_resource_rejects: event_data,
153 } => TestEvent::FailWithExternalResource(event_data.into_event()),
154 }
155 }
156}
157
158pub fn encode_test_event(
159 encoder: &mut Encoder<encoding::Framer>,
160 buf: &mut BytesMut,
161 event: TestEvent,
162) {
163 match event {
164 TestEvent::Passthrough(event) | TestEvent::FailWithExternalResource(event) => {
165 encoder
167 .encode(event, buf)
168 .expect("should not fail to encode input event");
169 }
170 TestEvent::FailWithAlternateEncoder(event) => {
171 let mut alt_encoder = if encoder.serializer().supports_json() {
176 Encoder::<encoding::Framer>::new(
177 LengthDelimitedEncoder::default().into(),
178 LogfmtSerializer.into(),
179 )
180 } else {
181 Encoder::<encoding::Framer>::new(
182 NewlineDelimitedEncoder::default().into(),
183 JsonSerializer::new(
184 MetricTagValues::default(),
185 JsonSerializerOptions::default(),
186 )
187 .into(),
188 )
189 };
190
191 alt_encoder
192 .encode(event, buf)
193 .expect("should not fail to encode input event");
194 }
195 }
196}