From a9840164cd307ea2f1bbdb62f61b9fd29af28fff Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Mon, 11 Nov 2019 23:26:12 +0100 Subject: [PATCH] Derive Serialize for collection types --- src/collections/all.rs | 131 +++------------------------------------- src/collections/only.rs | 57 ++--------------- src/stripped.rs | 27 +-------- 3 files changed, 15 insertions(+), 200 deletions(-) diff --git a/src/collections/all.rs b/src/collections/all.rs index 00ca26da..35109092 100644 --- a/src/collections/all.rs +++ b/src/collections/all.rs @@ -1,7 +1,7 @@ //! Enums for heterogeneous collections of events, inclusive for every event type that implements //! the trait of the same name. -use serde::{Serialize, Serializer}; +use serde::Serialize; use super::raw::all as raw; use crate::{ @@ -50,7 +50,8 @@ use crate::{ }; /// A basic event, room event, or state event. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize)] +#[serde(untagged)] #[allow(clippy::large_enum_variant)] pub enum Event { /// m.call.answer @@ -193,7 +194,8 @@ pub enum Event { } /// A room event or state event. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize)] +#[serde(untagged)] #[allow(clippy::large_enum_variant)] pub enum RoomEvent { /// m.call.answer @@ -279,7 +281,8 @@ pub enum RoomEvent { } /// A state event. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize)] +#[serde(untagged)] #[allow(clippy::large_enum_variant)] pub enum StateEvent { /// m.room.aliases @@ -479,126 +482,6 @@ impl TryFromRaw for StateEvent { } } -impl Serialize for Event { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - match *self { - Event::CallAnswer(ref event) => event.serialize(serializer), - Event::CallCandidates(ref event) => event.serialize(serializer), - Event::CallHangup(ref event) => event.serialize(serializer), - Event::CallInvite(ref event) => event.serialize(serializer), - Event::Direct(ref event) => event.serialize(serializer), - Event::Dummy(ref event) => event.serialize(serializer), - Event::ForwardedRoomKey(ref event) => event.serialize(serializer), - Event::FullyRead(ref event) => event.serialize(serializer), - Event::KeyVerificationAccept(ref event) => event.serialize(serializer), - Event::KeyVerificationCancel(ref event) => event.serialize(serializer), - Event::KeyVerificationKey(ref event) => event.serialize(serializer), - Event::KeyVerificationMac(ref event) => event.serialize(serializer), - Event::KeyVerificationRequest(ref event) => event.serialize(serializer), - Event::KeyVerificationStart(ref event) => event.serialize(serializer), - Event::IgnoredUserList(ref event) => event.serialize(serializer), - Event::Presence(ref event) => event.serialize(serializer), - Event::PushRules(ref event) => event.serialize(serializer), - Event::Receipt(ref event) => event.serialize(serializer), - Event::RoomAliases(ref event) => event.serialize(serializer), - Event::RoomAvatar(ref event) => event.serialize(serializer), - Event::RoomCanonicalAlias(ref event) => event.serialize(serializer), - Event::RoomCreate(ref event) => event.serialize(serializer), - Event::RoomEncrypted(ref event) => event.serialize(serializer), - Event::RoomEncryption(ref event) => event.serialize(serializer), - Event::RoomGuestAccess(ref event) => event.serialize(serializer), - Event::RoomHistoryVisibility(ref event) => event.serialize(serializer), - Event::RoomJoinRules(ref event) => event.serialize(serializer), - Event::RoomMember(ref event) => event.serialize(serializer), - Event::RoomMessage(ref event) => event.serialize(serializer), - Event::RoomMessageFeedback(ref event) => event.serialize(serializer), - Event::RoomName(ref event) => event.serialize(serializer), - Event::RoomPinnedEvents(ref event) => event.serialize(serializer), - Event::RoomPowerLevels(ref event) => event.serialize(serializer), - Event::RoomRedaction(ref event) => event.serialize(serializer), - Event::RoomServerAcl(ref event) => event.serialize(serializer), - Event::RoomThirdPartyInvite(ref event) => event.serialize(serializer), - Event::RoomTombstone(ref event) => event.serialize(serializer), - Event::RoomTopic(ref event) => event.serialize(serializer), - Event::RoomKey(ref event) => event.serialize(serializer), - Event::RoomKeyRequest(ref event) => event.serialize(serializer), - Event::Sticker(ref event) => event.serialize(serializer), - Event::Tag(ref event) => event.serialize(serializer), - Event::Typing(ref event) => event.serialize(serializer), - Event::Custom(ref event) => event.serialize(serializer), - Event::CustomRoom(ref event) => event.serialize(serializer), - Event::CustomState(ref event) => event.serialize(serializer), - } - } -} - -impl Serialize for RoomEvent { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - match *self { - RoomEvent::CallAnswer(ref event) => event.serialize(serializer), - RoomEvent::CallCandidates(ref event) => event.serialize(serializer), - RoomEvent::CallHangup(ref event) => event.serialize(serializer), - RoomEvent::CallInvite(ref event) => event.serialize(serializer), - RoomEvent::RoomAliases(ref event) => event.serialize(serializer), - RoomEvent::RoomAvatar(ref event) => event.serialize(serializer), - RoomEvent::RoomCanonicalAlias(ref event) => event.serialize(serializer), - RoomEvent::RoomCreate(ref event) => event.serialize(serializer), - RoomEvent::RoomEncrypted(ref event) => event.serialize(serializer), - RoomEvent::RoomEncryption(ref event) => event.serialize(serializer), - RoomEvent::RoomGuestAccess(ref event) => event.serialize(serializer), - RoomEvent::RoomHistoryVisibility(ref event) => event.serialize(serializer), - RoomEvent::RoomJoinRules(ref event) => event.serialize(serializer), - RoomEvent::RoomMember(ref event) => event.serialize(serializer), - RoomEvent::RoomMessage(ref event) => event.serialize(serializer), - RoomEvent::RoomMessageFeedback(ref event) => event.serialize(serializer), - RoomEvent::RoomName(ref event) => event.serialize(serializer), - RoomEvent::RoomPinnedEvents(ref event) => event.serialize(serializer), - RoomEvent::RoomPowerLevels(ref event) => event.serialize(serializer), - RoomEvent::RoomRedaction(ref event) => event.serialize(serializer), - RoomEvent::RoomServerAcl(ref event) => event.serialize(serializer), - RoomEvent::RoomThirdPartyInvite(ref event) => event.serialize(serializer), - RoomEvent::RoomTombstone(ref event) => event.serialize(serializer), - RoomEvent::RoomTopic(ref event) => event.serialize(serializer), - RoomEvent::Sticker(ref event) => event.serialize(serializer), - RoomEvent::CustomRoom(ref event) => event.serialize(serializer), - RoomEvent::CustomState(ref event) => event.serialize(serializer), - } - } -} - -impl Serialize for StateEvent { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - match *self { - StateEvent::RoomAliases(ref event) => event.serialize(serializer), - StateEvent::RoomAvatar(ref event) => event.serialize(serializer), - StateEvent::RoomCanonicalAlias(ref event) => event.serialize(serializer), - StateEvent::RoomCreate(ref event) => event.serialize(serializer), - StateEvent::RoomEncryption(ref event) => event.serialize(serializer), - StateEvent::RoomGuestAccess(ref event) => event.serialize(serializer), - StateEvent::RoomHistoryVisibility(ref event) => event.serialize(serializer), - StateEvent::RoomJoinRules(ref event) => event.serialize(serializer), - StateEvent::RoomMember(ref event) => event.serialize(serializer), - StateEvent::RoomName(ref event) => event.serialize(serializer), - StateEvent::RoomPinnedEvents(ref event) => event.serialize(serializer), - StateEvent::RoomPowerLevels(ref event) => event.serialize(serializer), - StateEvent::RoomServerAcl(ref event) => event.serialize(serializer), - StateEvent::RoomThirdPartyInvite(ref event) => event.serialize(serializer), - StateEvent::RoomTombstone(ref event) => event.serialize(serializer), - StateEvent::RoomTopic(ref event) => event.serialize(serializer), - StateEvent::CustomState(ref event) => event.serialize(serializer), - } - } -} - macro_rules! impl_from_t_for_event { ($ty:ty, $variant:ident) => { impl From<$ty> for Event { diff --git a/src/collections/only.rs b/src/collections/only.rs index a532090b..6ba0eed2 100644 --- a/src/collections/only.rs +++ b/src/collections/only.rs @@ -1,7 +1,7 @@ //! Enums for heterogeneous collections of events, exclusive to event types that implement "at //! most" the trait of the same name. -use serde::{Serialize, Serializer}; +use serde::Serialize; pub use super::{all::StateEvent, raw::only as raw}; use crate::{ @@ -34,7 +34,8 @@ use crate::{ }; /// A basic event. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize)] +#[serde(untagged)] #[allow(clippy::large_enum_variant)] pub enum Event { /// m.direct @@ -96,7 +97,8 @@ pub enum Event { } /// A room event. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize)] +#[serde(untagged)] #[allow(clippy::large_enum_variant)] pub enum RoomEvent { /// m.call.answer @@ -191,55 +193,6 @@ impl TryFromRaw for RoomEvent { } } -impl Serialize for Event { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - match *self { - Event::Direct(ref event) => event.serialize(serializer), - Event::Dummy(ref event) => event.serialize(serializer), - Event::ForwardedRoomKey(ref event) => event.serialize(serializer), - Event::FullyRead(ref event) => event.serialize(serializer), - Event::KeyVerificationAccept(ref event) => event.serialize(serializer), - Event::KeyVerificationCancel(ref event) => event.serialize(serializer), - Event::KeyVerificationKey(ref event) => event.serialize(serializer), - Event::KeyVerificationMac(ref event) => event.serialize(serializer), - Event::KeyVerificationRequest(ref event) => event.serialize(serializer), - Event::KeyVerificationStart(ref event) => event.serialize(serializer), - Event::IgnoredUserList(ref event) => event.serialize(serializer), - Event::Presence(ref event) => event.serialize(serializer), - Event::PushRules(ref event) => event.serialize(serializer), - Event::Receipt(ref event) => event.serialize(serializer), - Event::RoomKey(ref event) => event.serialize(serializer), - Event::RoomKeyRequest(ref event) => event.serialize(serializer), - Event::Tag(ref event) => event.serialize(serializer), - Event::Typing(ref event) => event.serialize(serializer), - Event::Custom(ref event) => event.serialize(serializer), - } - } -} - -impl Serialize for RoomEvent { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - match *self { - RoomEvent::CallAnswer(ref event) => event.serialize(serializer), - RoomEvent::CallCandidates(ref event) => event.serialize(serializer), - RoomEvent::CallHangup(ref event) => event.serialize(serializer), - RoomEvent::CallInvite(ref event) => event.serialize(serializer), - RoomEvent::RoomEncrypted(ref event) => event.serialize(serializer), - RoomEvent::RoomMessage(ref event) => event.serialize(serializer), - RoomEvent::RoomMessageFeedback(ref event) => event.serialize(serializer), - RoomEvent::RoomRedaction(ref event) => event.serialize(serializer), - RoomEvent::Sticker(ref event) => event.serialize(serializer), - RoomEvent::CustomRoom(ref event) => event.serialize(serializer), - } - } -} - macro_rules! impl_from_t_for_event { ($ty:ty, $variant:ident) => { impl From<$ty> for Event { diff --git a/src/stripped.rs b/src/stripped.rs index 15855be4..d2879f7e 100644 --- a/src/stripped.rs +++ b/src/stripped.rs @@ -6,7 +6,7 @@ //! the other fields are otherwise inapplicable. use ruma_identifiers::UserId; -use serde::{de::DeserializeOwned, Deserialize, Deserializer, Serialize, Serializer}; +use serde::{de::DeserializeOwned, Deserialize, Deserializer, Serialize}; use serde_json::Value; use crate::{ @@ -23,7 +23,8 @@ use crate::{ }; /// A stripped-down version of a state event that is included along with some other events. -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Serialize)] +#[serde(untagged)] #[allow(clippy::large_enum_variant)] pub enum StrippedState { /// A stripped-down version of the *m.room.aliases* event. @@ -172,28 +173,6 @@ where } } -impl Serialize for StrippedState { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - match *self { - StrippedState::RoomAliases(ref event) => event.serialize(serializer), - StrippedState::RoomAvatar(ref event) => event.serialize(serializer), - StrippedState::RoomCanonicalAlias(ref event) => event.serialize(serializer), - StrippedState::RoomCreate(ref event) => event.serialize(serializer), - StrippedState::RoomGuestAccess(ref event) => event.serialize(serializer), - StrippedState::RoomHistoryVisibility(ref event) => event.serialize(serializer), - StrippedState::RoomJoinRules(ref event) => event.serialize(serializer), - StrippedState::RoomMember(ref event) => event.serialize(serializer), - StrippedState::RoomName(ref event) => event.serialize(serializer), - StrippedState::RoomPowerLevels(ref event) => event.serialize(serializer), - StrippedState::RoomThirdPartyInvite(ref event) => event.serialize(serializer), - StrippedState::RoomTopic(ref event) => event.serialize(serializer), - } - } -} - impl<'de, C> Deserialize<'de> for StrippedStateContent where C: DeserializeOwned,