Derive Serialize for collection types

This commit is contained in:
Jonas Platte 2019-11-11 23:26:12 +01:00
parent 9e50de0d13
commit a9840164cd
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
3 changed files with 15 additions and 200 deletions

View File

@ -1,7 +1,7 @@
//! Enums for heterogeneous collections of events, inclusive for every event type that implements //! Enums for heterogeneous collections of events, inclusive for every event type that implements
//! the trait of the same name. //! the trait of the same name.
use serde::{Serialize, Serializer}; use serde::Serialize;
use super::raw::all as raw; use super::raw::all as raw;
use crate::{ use crate::{
@ -50,7 +50,8 @@ use crate::{
}; };
/// A basic event, room event, or state event. /// A basic event, room event, or state event.
#[derive(Clone, Debug)] #[derive(Clone, Debug, Serialize)]
#[serde(untagged)]
#[allow(clippy::large_enum_variant)] #[allow(clippy::large_enum_variant)]
pub enum Event { pub enum Event {
/// m.call.answer /// m.call.answer
@ -193,7 +194,8 @@ pub enum Event {
} }
/// A room event or state event. /// A room event or state event.
#[derive(Clone, Debug)] #[derive(Clone, Debug, Serialize)]
#[serde(untagged)]
#[allow(clippy::large_enum_variant)] #[allow(clippy::large_enum_variant)]
pub enum RoomEvent { pub enum RoomEvent {
/// m.call.answer /// m.call.answer
@ -279,7 +281,8 @@ pub enum RoomEvent {
} }
/// A state event. /// A state event.
#[derive(Clone, Debug)] #[derive(Clone, Debug, Serialize)]
#[serde(untagged)]
#[allow(clippy::large_enum_variant)] #[allow(clippy::large_enum_variant)]
pub enum StateEvent { pub enum StateEvent {
/// m.room.aliases /// m.room.aliases
@ -479,126 +482,6 @@ impl TryFromRaw for StateEvent {
} }
} }
impl Serialize for Event {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
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<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
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<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
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 { macro_rules! impl_from_t_for_event {
($ty:ty, $variant:ident) => { ($ty:ty, $variant:ident) => {
impl From<$ty> for Event { impl From<$ty> for Event {

View File

@ -1,7 +1,7 @@
//! Enums for heterogeneous collections of events, exclusive to event types that implement "at //! Enums for heterogeneous collections of events, exclusive to event types that implement "at
//! most" the trait of the same name. //! most" the trait of the same name.
use serde::{Serialize, Serializer}; use serde::Serialize;
pub use super::{all::StateEvent, raw::only as raw}; pub use super::{all::StateEvent, raw::only as raw};
use crate::{ use crate::{
@ -34,7 +34,8 @@ use crate::{
}; };
/// A basic event. /// A basic event.
#[derive(Clone, Debug)] #[derive(Clone, Debug, Serialize)]
#[serde(untagged)]
#[allow(clippy::large_enum_variant)] #[allow(clippy::large_enum_variant)]
pub enum Event { pub enum Event {
/// m.direct /// m.direct
@ -96,7 +97,8 @@ pub enum Event {
} }
/// A room event. /// A room event.
#[derive(Clone, Debug)] #[derive(Clone, Debug, Serialize)]
#[serde(untagged)]
#[allow(clippy::large_enum_variant)] #[allow(clippy::large_enum_variant)]
pub enum RoomEvent { pub enum RoomEvent {
/// m.call.answer /// m.call.answer
@ -191,55 +193,6 @@ impl TryFromRaw for RoomEvent {
} }
} }
impl Serialize for Event {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
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<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
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 { macro_rules! impl_from_t_for_event {
($ty:ty, $variant:ident) => { ($ty:ty, $variant:ident) => {
impl From<$ty> for Event { impl From<$ty> for Event {

View File

@ -6,7 +6,7 @@
//! the other fields are otherwise inapplicable. //! the other fields are otherwise inapplicable.
use ruma_identifiers::UserId; use ruma_identifiers::UserId;
use serde::{de::DeserializeOwned, Deserialize, Deserializer, Serialize, Serializer}; use serde::{de::DeserializeOwned, Deserialize, Deserializer, Serialize};
use serde_json::Value; use serde_json::Value;
use crate::{ use crate::{
@ -23,7 +23,8 @@ use crate::{
}; };
/// A stripped-down version of a state event that is included along with some other events. /// 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)] #[allow(clippy::large_enum_variant)]
pub enum StrippedState { pub enum StrippedState {
/// A stripped-down version of the *m.room.aliases* event. /// A stripped-down version of the *m.room.aliases* event.
@ -172,28 +173,6 @@ where
} }
} }
impl Serialize for StrippedState {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
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<C> impl<'de, C> Deserialize<'de> for StrippedStateContent<C>
where where
C: DeserializeOwned, C: DeserializeOwned,