From 534cf01fd296899b12d3994ba61b5b4060a7f47c Mon Sep 17 00:00:00 2001 From: slinkydeveloper Date: Mon, 18 May 2020 12:18:28 +0200 Subject: [PATCH] Changed again interface now to work similar to a builder (receives self -> return self) Signed-off-by: Francesco Guardiani --- src/event/message.rs | 45 ++++++++++++------------- src/event/v03/attributes.rs | 66 ++++++++++++++++++++----------------- src/event/v03/message.rs | 24 +++++++------- src/event/v10/attributes.rs | 66 ++++++++++++++++++++----------------- src/event/v10/message.rs | 24 +++++++------- src/message/deserializer.rs | 18 +++++----- src/message/error.rs | 3 +- src/message/serializer.rs | 16 ++++----- tests/message.rs | 12 +++---- 9 files changed, 143 insertions(+), 131 deletions(-) diff --git a/src/event/message.rs b/src/event/message.rs index cd7bf93..f4fc3b1 100644 --- a/src/event/message.rs +++ b/src/event/message.rs @@ -3,12 +3,12 @@ use super::Event; use super::{Attributes, AttributesReader}; use crate::event::SpecVersion; use crate::message::{ - BinaryDeserializer, BinarySerializer, DeserializationResult, Error, MessageAttributeValue, - SerializationResult, StructuredDeserializer, StructuredSerializer, + BinaryDeserializer, BinarySerializer, Result, MessageAttributeValue, + StructuredDeserializer, StructuredSerializer, }; impl StructuredDeserializer for Event { - fn deserialize_structured>(self, visitor: V) -> Result { + fn deserialize_structured>(self, visitor: V) -> Result { let vec: Vec = serde_json::to_vec(&self)?; visitor.set_structured_event(vec) } @@ -18,11 +18,11 @@ impl BinaryDeserializer for Event { fn deserialize_binary>( self, mut visitor: V, - ) -> Result { - visitor.set_spec_version(self.get_specversion())?; - self.attributes.deserialize_attributes(&mut visitor)?; + ) -> Result { + visitor = visitor.set_spec_version(self.get_specversion())?; + visitor = self.attributes.deserialize_attributes(visitor)?; for (k, v) in self.extensions.into_iter() { - visitor.set_extension(&k, v.into())?; + visitor = visitor.set_extension(&k, v.into())?; } match self.data { Some(Data::String(s)) => visitor.end_with_data(s.into_bytes()), @@ -39,8 +39,8 @@ impl BinaryDeserializer for Event { pub(crate) trait AttributesDeserializer { fn deserialize_attributes>( self, - visitor: &mut V, - ) -> DeserializationResult; + visitor: V, + ) -> Result; } pub(crate) trait AttributesSerializer { @@ -48,14 +48,14 @@ pub(crate) trait AttributesSerializer { &mut self, name: &str, value: MessageAttributeValue, - ) -> SerializationResult; + ) -> Result<()>; } impl AttributesDeserializer for Attributes { fn deserialize_attributes>( self, - visitor: &mut V, - ) -> DeserializationResult { + visitor: V, + ) -> Result { match self { Attributes::V03(v03) => v03.deserialize_attributes(visitor), Attributes::V10(v10) => v10.deserialize_attributes(visitor), @@ -68,7 +68,7 @@ impl AttributesSerializer for Attributes { &mut self, name: &str, value: MessageAttributeValue, - ) -> SerializationResult { + ) -> Result<()> { match self { Attributes::V03(v03) => v03.serialize_attribute(name, value), Attributes::V10(v10) => v10.serialize_attribute(name, value), @@ -77,7 +77,7 @@ impl AttributesSerializer for Attributes { } impl StructuredSerializer for Event { - fn set_structured_event(mut self, bytes: Vec) -> Result { + fn set_structured_event(mut self, bytes: Vec) -> Result { let new_event: Event = serde_json::from_slice(&bytes)?; self.attributes = new_event.attributes; self.data = new_event.data; @@ -87,29 +87,30 @@ impl StructuredSerializer for Event { } impl BinarySerializer for Event { - fn set_spec_version(&mut self, spec_version: SpecVersion) -> SerializationResult { + fn set_spec_version(mut self, spec_version: SpecVersion) -> Result { match spec_version { SpecVersion::V03 => self.attributes = self.attributes.clone().into_v03(), SpecVersion::V10 => self.attributes = self.attributes.clone().into_v10(), } - Ok(()) + Ok(self) } - fn set_attribute(&mut self, name: &str, value: MessageAttributeValue) -> SerializationResult { - self.attributes.serialize_attribute(name, value) + fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result { + self.attributes.serialize_attribute(name, value)?; + Ok(self) } - fn set_extension(&mut self, name: &str, value: MessageAttributeValue) -> SerializationResult { + fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result { self.extensions.insert(name.to_string(), value.into()); - Ok(()) + Ok(self) } - fn end_with_data(mut self, bytes: Vec) -> Result { + fn end_with_data(mut self, bytes: Vec) -> Result { self.data = Some(Data::from_binary(self.get_datacontenttype(), bytes)?); Ok(self) } - fn end(self) -> Result { + fn end(self) -> Result { Ok(self) } } diff --git a/src/event/v03/attributes.rs b/src/event/v03/attributes.rs index 27bc697..59fbcaa 100644 --- a/src/event/v03/attributes.rs +++ b/src/event/v03/attributes.rs @@ -1,7 +1,7 @@ use crate::event::attributes::{AttributeValue, AttributesConverter, DataAttributesWriter}; use crate::event::AttributesV10; use crate::event::{AttributesReader, AttributesWriter, SpecVersion}; -use chrono::{DateTime, NaiveDateTime, Utc}; +use chrono::{DateTime, Utc}; use hostname::get_hostname; use url::Url; use uuid::Uuid; @@ -187,34 +187,40 @@ impl AttributesConverter for Attributes { } } -#[test] -fn iterator_test_V03() { - let a = Attributes { - id: String::from("1"), - ty: String::from("someType"), - source: Url::parse("https://example.net").unwrap(), - datacontenttype: None, - schemaurl: None, - subject: None, - time: Some(DateTime::::from_utc( - NaiveDateTime::from_timestamp(61, 0), - Utc, - )), - }; - let b = &mut a.into_iter(); - let time = DateTime::::from_utc(NaiveDateTime::from_timestamp(61, 0), Utc); +#[cfg(test)] +mod tests { + use super::*; + use chrono::NaiveDateTime; - assert_eq!(("id", AttributeValue::String("1")), b.next().unwrap()); - assert_eq!( - ("type", AttributeValue::String("someType")), - b.next().unwrap() - ); - assert_eq!( - ( - "source", - AttributeValue::URIRef(&Url::parse("https://example.net").unwrap()) - ), - b.next().unwrap() - ); - assert_eq!(("time", AttributeValue::Time(&time)), b.next().unwrap()); + #[test] + fn iterator_test_V03() { + let a = Attributes { + id: String::from("1"), + ty: String::from("someType"), + source: Url::parse("https://example.net").unwrap(), + datacontenttype: None, + schemaurl: None, + subject: None, + time: Some(DateTime::::from_utc( + NaiveDateTime::from_timestamp(61, 0), + Utc, + )), + }; + let b = &mut a.into_iter(); + let time = DateTime::::from_utc(NaiveDateTime::from_timestamp(61, 0), Utc); + + assert_eq!(("id", AttributeValue::String("1")), b.next().unwrap()); + assert_eq!( + ("type", AttributeValue::String("someType")), + b.next().unwrap() + ); + assert_eq!( + ( + "source", + AttributeValue::URIRef(&Url::parse("https://example.net").unwrap()) + ), + b.next().unwrap() + ); + assert_eq!(("time", AttributeValue::Time(&time)), b.next().unwrap()); + } } diff --git a/src/event/v03/message.rs b/src/event/v03/message.rs index e1c6233..11a8bcd 100644 --- a/src/event/v03/message.rs +++ b/src/event/v03/message.rs @@ -1,38 +1,38 @@ use crate::message::{ - BinarySerializer, DeserializationResult, Error, MessageAttributeValue, SerializationResult, + BinarySerializer, Result, Error, MessageAttributeValue, }; use std::convert::TryInto; impl crate::event::message::AttributesDeserializer for super::Attributes { fn deserialize_attributes>( self, - visitor: &mut V, - ) -> DeserializationResult { - visitor.set_attribute("id", MessageAttributeValue::String(self.id))?; - visitor.set_attribute("type", MessageAttributeValue::String(self.ty))?; - visitor.set_attribute("source", MessageAttributeValue::UriRef(self.source))?; + mut visitor: V, + ) -> Result { + visitor = visitor.set_attribute("id", MessageAttributeValue::String(self.id))?; + visitor = visitor.set_attribute("type", MessageAttributeValue::String(self.ty))?; + visitor = visitor.set_attribute("source", MessageAttributeValue::UriRef(self.source))?; if self.datacontenttype.is_some() { - visitor.set_attribute( + visitor = visitor.set_attribute( "datacontenttype", MessageAttributeValue::String(self.datacontenttype.unwrap()), )?; } if self.schemaurl.is_some() { - visitor.set_attribute( + visitor = visitor.set_attribute( "schemaurl", MessageAttributeValue::Uri(self.schemaurl.unwrap()), )?; } if self.subject.is_some() { - visitor.set_attribute( + visitor = visitor.set_attribute( "subject", MessageAttributeValue::String(self.subject.unwrap()), )?; } if self.time.is_some() { - visitor.set_attribute("time", MessageAttributeValue::DateTime(self.time.unwrap()))?; + visitor = visitor.set_attribute("time", MessageAttributeValue::DateTime(self.time.unwrap()))?; } - Ok(()) + Ok(visitor) } } @@ -41,7 +41,7 @@ impl crate::event::message::AttributesSerializer for super::Attributes { &mut self, name: &str, value: MessageAttributeValue, - ) -> SerializationResult { + ) -> Result<()> { match name { "id" => self.id = value.to_string(), "type" => self.ty = value.to_string(), diff --git a/src/event/v10/attributes.rs b/src/event/v10/attributes.rs index 06c128c..2bca0d3 100644 --- a/src/event/v10/attributes.rs +++ b/src/event/v10/attributes.rs @@ -1,6 +1,6 @@ use crate::event::attributes::{AttributeValue, AttributesConverter, DataAttributesWriter}; use crate::event::{AttributesReader, AttributesV03, AttributesWriter, SpecVersion}; -use chrono::{DateTime, NaiveDateTime, Utc}; +use chrono::{DateTime, Utc}; use hostname::get_hostname; use url::Url; use uuid::Uuid; @@ -186,34 +186,40 @@ impl AttributesConverter for Attributes { } } -#[test] -fn iterator_test_V10() { - let a = Attributes { - id: String::from("1"), - ty: String::from("someType"), - source: Url::parse("https://example.net").unwrap(), - datacontenttype: None, - dataschema: None, - subject: None, - time: Some(DateTime::::from_utc( - NaiveDateTime::from_timestamp(61, 0), - Utc, - )), - }; - let b = &mut a.into_iter(); - let time = DateTime::::from_utc(NaiveDateTime::from_timestamp(61, 0), Utc); +#[cfg(test)] +mod tests { + use super::*; + use chrono::NaiveDateTime; - assert_eq!(("id", AttributeValue::String("1")), b.next().unwrap()); - assert_eq!( - ("type", AttributeValue::String("someType")), - b.next().unwrap() - ); - assert_eq!( - ( - "source", - AttributeValue::URIRef(&Url::parse("https://example.net").unwrap()) - ), - b.next().unwrap() - ); - assert_eq!(("time", AttributeValue::Time(&time)), b.next().unwrap()); + #[test] + fn iterator_test_V10() { + let a = Attributes { + id: String::from("1"), + ty: String::from("someType"), + source: Url::parse("https://example.net").unwrap(), + datacontenttype: None, + dataschema: None, + subject: None, + time: Some(DateTime::::from_utc( + NaiveDateTime::from_timestamp(61, 0), + Utc, + )), + }; + let b = &mut a.into_iter(); + let time = DateTime::::from_utc(NaiveDateTime::from_timestamp(61, 0), Utc); + + assert_eq!(("id", AttributeValue::String("1")), b.next().unwrap()); + assert_eq!( + ("type", AttributeValue::String("someType")), + b.next().unwrap() + ); + assert_eq!( + ( + "source", + AttributeValue::URIRef(&Url::parse("https://example.net").unwrap()) + ), + b.next().unwrap() + ); + assert_eq!(("time", AttributeValue::Time(&time)), b.next().unwrap()); + } } diff --git a/src/event/v10/message.rs b/src/event/v10/message.rs index 73a3eb5..7e71304 100644 --- a/src/event/v10/message.rs +++ b/src/event/v10/message.rs @@ -1,38 +1,38 @@ use crate::message::{ - BinarySerializer, DeserializationResult, Error, MessageAttributeValue, SerializationResult, + BinarySerializer, Error, MessageAttributeValue, Result, }; use std::convert::TryInto; impl crate::event::message::AttributesDeserializer for super::Attributes { fn deserialize_attributes>( self, - visitor: &mut V, - ) -> DeserializationResult { - visitor.set_attribute("id", MessageAttributeValue::String(self.id))?; - visitor.set_attribute("type", MessageAttributeValue::String(self.ty))?; - visitor.set_attribute("source", MessageAttributeValue::UriRef(self.source))?; + mut visitor: V, + ) -> Result { + visitor = visitor.set_attribute("id", MessageAttributeValue::String(self.id))?; + visitor = visitor.set_attribute("type", MessageAttributeValue::String(self.ty))?; + visitor = visitor.set_attribute("source", MessageAttributeValue::UriRef(self.source))?; if self.datacontenttype.is_some() { - visitor.set_attribute( + visitor = visitor.set_attribute( "datacontenttype", MessageAttributeValue::String(self.datacontenttype.unwrap()), )?; } if self.dataschema.is_some() { - visitor.set_attribute( + visitor = visitor.set_attribute( "dataschema", MessageAttributeValue::Uri(self.dataschema.unwrap()), )?; } if self.subject.is_some() { - visitor.set_attribute( + visitor = visitor.set_attribute( "subject", MessageAttributeValue::String(self.subject.unwrap()), )?; } if self.time.is_some() { - visitor.set_attribute("time", MessageAttributeValue::DateTime(self.time.unwrap()))?; + visitor = visitor.set_attribute("time", MessageAttributeValue::DateTime(self.time.unwrap()))?; } - Ok(()) + Ok(visitor) } } @@ -41,7 +41,7 @@ impl crate::event::message::AttributesSerializer for super::Attributes { &mut self, name: &str, value: MessageAttributeValue, - ) -> SerializationResult { + ) -> Result<()> { match name { "id" => self.id = value.to_string(), "type" => self.ty = value.to_string(), diff --git a/src/message/deserializer.rs b/src/message/deserializer.rs index bc3bfb0..316f47c 100644 --- a/src/message/deserializer.rs +++ b/src/message/deserializer.rs @@ -1,4 +1,4 @@ -use super::{BinarySerializer, Encoding, Error, StructuredSerializer}; +use super::{BinarySerializer, Encoding, Error, StructuredSerializer, Result}; use crate::Event; pub trait StructuredDeserializer @@ -8,9 +8,9 @@ where fn deserialize_structured>( self, serializer: V, - ) -> Result; + ) -> Result; - fn into_event(self) -> Result { + fn into_event(self) -> Result { self.deserialize_structured(Event::default()) } } @@ -22,9 +22,9 @@ where fn deserialize_binary>( self, serializer: V, - ) -> Result; + ) -> Result; - fn into_event(self) -> Result { + fn into_event(self) -> Result { self.deserialize_binary(Event::default()) } } @@ -35,14 +35,14 @@ where { fn encoding(&self) -> Encoding; - fn into_event(self) -> Result { + fn into_event(self) -> Result { self.deserialize_to(Event::default()) } fn deserialize_to_binary>( self, serializer: T, - ) -> Result { + ) -> Result { if self.encoding() == Encoding::BINARY { return self.deserialize_binary(serializer); } @@ -53,7 +53,7 @@ where fn deserialize_to_structured>( self, serializer: T, - ) -> Result { + ) -> Result { if self.encoding() == Encoding::STRUCTURED { return self.deserialize_structured(serializer); } @@ -64,7 +64,7 @@ where fn deserialize_to + StructuredSerializer>( self, serializer: T, - ) -> Result { + ) -> Result { if self.encoding() == Encoding::STRUCTURED { self.deserialize_structured(serializer) } else { diff --git a/src/message/error.rs b/src/message/error.rs index 56f6411..137e56f 100644 --- a/src/message/error.rs +++ b/src/message/error.rs @@ -30,5 +30,4 @@ pub enum Error { Other { source: Box }, } -pub type SerializationResult = Result<(), Error>; -pub type DeserializationResult = Result<(), Error>; +pub type Result = std::result::Result; diff --git a/src/message/serializer.rs b/src/message/serializer.rs index 68bc02b..831aef7 100644 --- a/src/message/serializer.rs +++ b/src/message/serializer.rs @@ -1,18 +1,18 @@ -use super::{Error, MessageAttributeValue, SerializationResult}; +use super::{MessageAttributeValue, Result}; use crate::event::SpecVersion; pub trait StructuredSerializer { - fn set_structured_event(self, bytes: Vec) -> Result; + fn set_structured_event(self, bytes: Vec) -> Result; } -pub trait BinarySerializer { - fn set_spec_version(&mut self, spec_version: SpecVersion) -> SerializationResult; +pub trait BinarySerializer where Self: Sized { + fn set_spec_version(self, spec_version: SpecVersion) -> Result; - fn set_attribute(&mut self, name: &str, value: MessageAttributeValue) -> SerializationResult; + fn set_attribute(self, name: &str, value: MessageAttributeValue) -> Result; - fn set_extension(&mut self, name: &str, value: MessageAttributeValue) -> SerializationResult; + fn set_extension(self, name: &str, value: MessageAttributeValue) -> Result; - fn end_with_data(self, bytes: Vec) -> Result; + fn end_with_data(self, bytes: Vec) -> Result; - fn end(self) -> Result; + fn end(self) -> Result; } diff --git a/tests/message.rs b/tests/message.rs index 16d1e1f..bb7a1c5 100644 --- a/tests/message.rs +++ b/tests/message.rs @@ -1,13 +1,13 @@ mod test_data; use cloudevents::message::{ - BinaryDeserializer, BinarySerializer, DeserializationResult, Error, MessageAttributeValue, - StructuredDeserializer, + BinaryDeserializer, BinarySerializer, Error, MessageAttributeValue, + StructuredDeserializer, Result, }; use test_data::*; #[test] -fn message_v03_roundtrip_structured() -> DeserializationResult { +fn message_v03_roundtrip_structured() -> Result<()> { assert_eq!( v03::full_json_data(), StructuredDeserializer::into_event(v03::full_json_data())? @@ -16,7 +16,7 @@ fn message_v03_roundtrip_structured() -> DeserializationResult { } #[test] -fn message_v03_roundtrip_binary() -> DeserializationResult { +fn message_v03_roundtrip_binary() -> Result<()> { assert_eq!( v03::full_json_data(), BinaryDeserializer::into_event(v03::full_json_data())? @@ -25,7 +25,7 @@ fn message_v03_roundtrip_binary() -> DeserializationResult { } #[test] -fn message_v10_roundtrip_structured() -> DeserializationResult { +fn message_v10_roundtrip_structured() -> Result<()> { assert_eq!( v10::full_json_data(), StructuredDeserializer::into_event(v10::full_json_data())? @@ -34,7 +34,7 @@ fn message_v10_roundtrip_structured() -> DeserializationResult { } #[test] -fn message_v10_roundtrip_binary() -> DeserializationResult { +fn message_v10_roundtrip_binary() -> Result<()> { assert_eq!( v10::full_json_data(), BinaryDeserializer::into_event(v10::full_json_data())?