Skip to content

Commit 66b9bfd

Browse files
committed
De-macro-fy data parsing
The code is more legible without them, I think. I'm not sure their complexity is justified. Signed-off-by: Jim Crossley <[email protected]>
1 parent 05807fd commit 66b9bfd

File tree

3 files changed

+28
-35
lines changed

3 files changed

+28
-35
lines changed

src/event/format.rs

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -48,33 +48,23 @@ macro_rules! extract_field {
4848
};
4949
}
5050

51-
macro_rules! parse_data_json {
52-
($in:ident, $error:ty) => {
53-
serde_json::Value::deserialize($in.into_deserializer()).map_err(<$error>::custom)
54-
};
51+
pub fn parse_data_json<E: serde::de::Error>(v: Value) -> Result<Value, E> {
52+
Value::deserialize(v.into_deserializer()).map_err(E::custom)
5553
}
5654

57-
macro_rules! parse_data_string {
58-
($in:ident, $error:ty) => {
59-
parse_field!($in, String, $error)
60-
};
55+
pub fn parse_data_string<E: serde::de::Error>(v: Value) -> Result<String, E> {
56+
parse_field!(v, String, E)
6157
}
6258

63-
macro_rules! parse_json_data_base64 {
64-
($in:ident, $error:ty) => {{
65-
let data = parse_data_base64!($in, $error)?;
66-
serde_json::from_slice(&data).map_err(<$error>::custom)
67-
}};
59+
pub fn parse_data_base64<E: serde::de::Error>(v: Value) -> Result<Vec<u8>, E> {
60+
parse_field!(v, String, E).and_then(|s| {
61+
base64::decode(&s).map_err(|e| E::custom(format_args!("decode error `{}`", e)))
62+
})
6863
}
6964

70-
macro_rules! parse_data_base64 {
71-
($in:ident, $error:ty) => {
72-
parse_field!($in, String, $error).and_then(|s| {
73-
base64::decode(&s).map_err(|e| {
74-
<$error>::invalid_value(serde::de::Unexpected::Str(&s), &e.to_string().as_str())
75-
})
76-
})
77-
};
65+
pub fn parse_data_base64_json<E: serde::de::Error>(v: Value) -> Result<Value, E> {
66+
let data = parse_data_base64(v)?;
67+
serde_json::from_slice(&data).map_err(E::custom)
7868
}
7969

8070
pub(crate) trait EventFormatDeserializer {

src/event/v03/format.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
use super::Attributes;
22
use crate::event::data::is_json_content_type;
3+
use crate::event::format::{
4+
parse_data_base64, parse_data_base64_json, parse_data_json, parse_data_string,
5+
};
36
use crate::event::{Data, ExtensionValue};
47
use chrono::{DateTime, Utc};
58
use serde::de::IntoDeserializer;
@@ -45,10 +48,10 @@ impl crate::event::format::EventFormatDeserializer for EventFormatDeserializer {
4548
let is_json = is_json_content_type(content_type);
4649

4750
Ok(match (data, is_base64, is_json) {
48-
(Some(d), false, true) => Some(Data::Json(parse_data_json!(d, E)?)),
49-
(Some(d), false, false) => Some(Data::String(parse_data_string!(d, E)?)),
50-
(Some(d), true, true) => Some(Data::Json(parse_json_data_base64!(d, E)?)),
51-
(Some(d), true, false) => Some(Data::Binary(parse_data_base64!(d, E)?)),
51+
(Some(d), false, true) => Some(Data::Json(parse_data_json(d)?)),
52+
(Some(d), false, false) => Some(Data::String(parse_data_string(d)?)),
53+
(Some(d), true, true) => Some(Data::Json(parse_data_base64_json(d)?)),
54+
(Some(d), true, false) => Some(Data::Binary(parse_data_base64(d)?)),
5255
(None, _, _) => None,
5356
})
5457
}

src/event/v10/format.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
use super::Attributes;
22
use crate::event::data::is_json_content_type;
3+
use crate::event::format::{
4+
parse_data_base64, parse_data_base64_json, parse_data_json, parse_data_string,
5+
};
36
use crate::event::{Data, ExtensionValue};
47
use chrono::{DateTime, Utc};
58
use serde::de::IntoDeserializer;
@@ -40,16 +43,13 @@ impl crate::event::format::EventFormatDeserializer for EventFormatDeserializer {
4043
let is_json = is_json_content_type(content_type);
4144

4245
Ok(match (data, data_base64, is_json) {
43-
(Some(d), None, true) => Some(Data::Json(parse_data_json!(d, E)?)),
44-
(Some(d), None, false) => Some(Data::String(parse_data_string!(d, E)?)),
45-
(None, Some(d), true) => {
46-
let dc = d.to_owned();
47-
match parse_json_data_base64!(dc, E) {
48-
Ok(x) => Some(Data::Json(x)),
49-
Err(_) => Some(Data::Binary(parse_data_base64!(d, E)?)),
50-
}
51-
}
52-
(None, Some(d), false) => Some(Data::Binary(parse_data_base64!(d, E)?)),
46+
(Some(d), None, true) => Some(Data::Json(parse_data_json(d)?)),
47+
(Some(d), None, false) => Some(Data::String(parse_data_string(d)?)),
48+
(None, Some(d), true) => match parse_data_base64_json::<E>(d.to_owned()) {
49+
Ok(x) => Some(Data::Json(x)),
50+
Err(_) => Some(Data::Binary(parse_data_base64(d)?)),
51+
},
52+
(None, Some(d), false) => Some(Data::Binary(parse_data_base64(d)?)),
5353
(Some(_), Some(_), _) => {
5454
return Err(E::custom("Cannot have both data and data_base64 field"))
5555
}

0 commit comments

Comments
 (0)