From 66b9bfde1becc373f185ec760bba3387b3479997 Mon Sep 17 00:00:00 2001 From: Jim Crossley Date: Thu, 11 Nov 2021 15:33:26 -0500 Subject: [PATCH] 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 --- src/event/format.rs | 32 +++++++++++--------------------- src/event/v03/format.rs | 11 +++++++---- src/event/v10/format.rs | 20 ++++++++++---------- 3 files changed, 28 insertions(+), 35 deletions(-) diff --git a/src/event/format.rs b/src/event/format.rs index 817d470..56b6aa4 100644 --- a/src/event/format.rs +++ b/src/event/format.rs @@ -48,33 +48,23 @@ macro_rules! extract_field { }; } -macro_rules! parse_data_json { - ($in:ident, $error:ty) => { - serde_json::Value::deserialize($in.into_deserializer()).map_err(<$error>::custom) - }; +pub fn parse_data_json(v: Value) -> Result { + Value::deserialize(v.into_deserializer()).map_err(E::custom) } -macro_rules! parse_data_string { - ($in:ident, $error:ty) => { - parse_field!($in, String, $error) - }; +pub fn parse_data_string(v: Value) -> Result { + parse_field!(v, String, E) } -macro_rules! parse_json_data_base64 { - ($in:ident, $error:ty) => {{ - let data = parse_data_base64!($in, $error)?; - serde_json::from_slice(&data).map_err(<$error>::custom) - }}; +pub fn parse_data_base64(v: Value) -> Result, E> { + parse_field!(v, String, E).and_then(|s| { + base64::decode(&s).map_err(|e| E::custom(format_args!("decode error `{}`", e))) + }) } -macro_rules! parse_data_base64 { - ($in:ident, $error:ty) => { - parse_field!($in, String, $error).and_then(|s| { - base64::decode(&s).map_err(|e| { - <$error>::invalid_value(serde::de::Unexpected::Str(&s), &e.to_string().as_str()) - }) - }) - }; +pub fn parse_data_base64_json(v: Value) -> Result { + let data = parse_data_base64(v)?; + serde_json::from_slice(&data).map_err(E::custom) } pub(crate) trait EventFormatDeserializer { diff --git a/src/event/v03/format.rs b/src/event/v03/format.rs index 4cb4de6..542b8de 100644 --- a/src/event/v03/format.rs +++ b/src/event/v03/format.rs @@ -1,5 +1,8 @@ use super::Attributes; use crate::event::data::is_json_content_type; +use crate::event::format::{ + parse_data_base64, parse_data_base64_json, parse_data_json, parse_data_string, +}; use crate::event::{Data, ExtensionValue}; use chrono::{DateTime, Utc}; use serde::de::IntoDeserializer; @@ -45,10 +48,10 @@ impl crate::event::format::EventFormatDeserializer for EventFormatDeserializer { let is_json = is_json_content_type(content_type); Ok(match (data, is_base64, is_json) { - (Some(d), false, true) => Some(Data::Json(parse_data_json!(d, E)?)), - (Some(d), false, false) => Some(Data::String(parse_data_string!(d, E)?)), - (Some(d), true, true) => Some(Data::Json(parse_json_data_base64!(d, E)?)), - (Some(d), true, false) => Some(Data::Binary(parse_data_base64!(d, E)?)), + (Some(d), false, true) => Some(Data::Json(parse_data_json(d)?)), + (Some(d), false, false) => Some(Data::String(parse_data_string(d)?)), + (Some(d), true, true) => Some(Data::Json(parse_data_base64_json(d)?)), + (Some(d), true, false) => Some(Data::Binary(parse_data_base64(d)?)), (None, _, _) => None, }) } diff --git a/src/event/v10/format.rs b/src/event/v10/format.rs index ed39d91..11f4f47 100644 --- a/src/event/v10/format.rs +++ b/src/event/v10/format.rs @@ -1,5 +1,8 @@ use super::Attributes; use crate::event::data::is_json_content_type; +use crate::event::format::{ + parse_data_base64, parse_data_base64_json, parse_data_json, parse_data_string, +}; use crate::event::{Data, ExtensionValue}; use chrono::{DateTime, Utc}; use serde::de::IntoDeserializer; @@ -40,16 +43,13 @@ impl crate::event::format::EventFormatDeserializer for EventFormatDeserializer { let is_json = is_json_content_type(content_type); Ok(match (data, data_base64, is_json) { - (Some(d), None, true) => Some(Data::Json(parse_data_json!(d, E)?)), - (Some(d), None, false) => Some(Data::String(parse_data_string!(d, E)?)), - (None, Some(d), true) => { - let dc = d.to_owned(); - match parse_json_data_base64!(dc, E) { - Ok(x) => Some(Data::Json(x)), - Err(_) => Some(Data::Binary(parse_data_base64!(d, E)?)), - } - } - (None, Some(d), false) => Some(Data::Binary(parse_data_base64!(d, E)?)), + (Some(d), None, true) => Some(Data::Json(parse_data_json(d)?)), + (Some(d), None, false) => Some(Data::String(parse_data_string(d)?)), + (None, Some(d), true) => match parse_data_base64_json::(d.to_owned()) { + Ok(x) => Some(Data::Json(x)), + Err(_) => Some(Data::Binary(parse_data_base64(d)?)), + }, + (None, Some(d), false) => Some(Data::Binary(parse_data_base64(d)?)), (Some(_), Some(_), _) => { return Err(E::custom("Cannot have both data and data_base64 field")) }