diff --git a/src/collections/raw/all.rs b/src/collections/raw/all.rs index 6f61e5a4..1bddf49f 100644 --- a/src/collections/raw/all.rs +++ b/src/collections/raw/all.rs @@ -2,7 +2,7 @@ //! the trait of the same name. use serde::{de::Error as _, Deserialize, Deserializer}; -use serde_json::{from_value, Value}; +use serde_json::Value; use crate::{ call::{ @@ -47,7 +47,7 @@ use crate::{ sticker::raw::StickerEvent, tag::raw::TagEvent, typing::raw::TypingEvent, - util::{get_field, serde_json_error_to_generic_de_error as conv_err}, + util::get_field, CustomEvent, CustomRoomEvent, CustomStateEvent, EventType, }; @@ -341,101 +341,56 @@ impl<'de> Deserialize<'de> for Event { where D: Deserializer<'de>, { + use crate::util::try_variant_from_value as from_value; use EventType::*; let value = Value::deserialize(deserializer)?; let event_type = get_field(&value, "type")?; match event_type { - CallAnswer => from_value(value).map(Event::CallAnswer).map_err(conv_err), - CallCandidates => from_value(value) - .map(Event::CallCandidates) - .map_err(conv_err), - CallHangup => from_value(value).map(Event::CallHangup).map_err(conv_err), - CallInvite => from_value(value).map(Event::CallInvite).map_err(conv_err), - Direct => from_value(value).map(Event::Direct).map_err(conv_err), - Dummy => from_value(value).map(Event::Dummy).map_err(conv_err), - ForwardedRoomKey => from_value(value) - .map(Event::ForwardedRoomKey) - .map_err(conv_err), - FullyRead => from_value(value).map(Event::FullyRead).map_err(conv_err), - IgnoredUserList => from_value(value) - .map(Event::IgnoredUserList) - .map_err(conv_err), - KeyVerificationAccept => from_value(value) - .map(Event::KeyVerificationAccept) - .map_err(conv_err), - KeyVerificationCancel => from_value(value) - .map(Event::KeyVerificationCancel) - .map_err(conv_err), - KeyVerificationKey => from_value(value) - .map(Event::KeyVerificationKey) - .map_err(conv_err), - KeyVerificationMac => from_value(value) - .map(Event::KeyVerificationMac) - .map_err(conv_err), - KeyVerificationRequest => from_value(value) - .map(Event::KeyVerificationRequest) - .map_err(conv_err), - KeyVerificationStart => from_value(value) - .map(Event::KeyVerificationStart) - .map_err(conv_err), - Presence => from_value(value).map(Event::Presence).map_err(conv_err), - PushRules => from_value(value).map(Event::PushRules).map_err(conv_err), - Receipt => from_value(value).map(Event::Receipt).map_err(conv_err), - RoomAliases => from_value(value).map(Event::RoomAliases).map_err(conv_err), - RoomAvatar => from_value(value).map(Event::RoomAvatar).map_err(conv_err), - RoomCanonicalAlias => from_value(value) - .map(Event::RoomCanonicalAlias) - .map_err(conv_err), - RoomCreate => from_value(value).map(Event::RoomCreate).map_err(conv_err), - RoomEncrypted => from_value(value) - .map(Event::RoomEncrypted) - .map_err(conv_err), - RoomEncryption => from_value(value) - .map(Event::RoomEncryption) - .map_err(conv_err), - RoomGuestAccess => from_value(value) - .map(Event::RoomGuestAccess) - .map_err(conv_err), - RoomHistoryVisibility => from_value(value) - .map(Event::RoomHistoryVisibility) - .map_err(conv_err), - RoomJoinRules => from_value(value) - .map(Event::RoomJoinRules) - .map_err(conv_err), - RoomMember => from_value(value).map(Event::RoomMember).map_err(conv_err), - RoomMessage => from_value(value).map(Event::RoomMessage).map_err(conv_err), - RoomMessageFeedback => from_value(value) - .map(Event::RoomMessageFeedback) - .map_err(conv_err), - RoomName => from_value(value).map(Event::RoomName).map_err(conv_err), - RoomPinnedEvents => from_value(value) - .map(Event::RoomPinnedEvents) - .map_err(conv_err), - RoomPowerLevels => from_value(value) - .map(Event::RoomPowerLevels) - .map_err(conv_err), - RoomRedaction => from_value(value) - .map(Event::RoomRedaction) - .map_err(conv_err), - RoomServerAcl => from_value(value) - .map(Event::RoomServerAcl) - .map_err(conv_err), - RoomThirdPartyInvite => from_value(value) - .map(Event::RoomThirdPartyInvite) - .map_err(conv_err), - RoomTombstone => from_value(value) - .map(Event::RoomTombstone) - .map_err(conv_err), - RoomTopic => from_value(value).map(Event::RoomTopic).map_err(conv_err), - RoomKey => from_value(value).map(Event::RoomKey).map_err(conv_err), - RoomKeyRequest => from_value(value) - .map(Event::RoomKeyRequest) - .map_err(conv_err), - Sticker => from_value(value).map(Event::Sticker).map_err(conv_err), - Tag => from_value(value).map(Event::Tag).map_err(conv_err), - Typing => from_value(value).map(Event::Typing).map_err(conv_err), + CallAnswer => from_value(value, Event::CallAnswer), + CallCandidates => from_value(value, Event::CallCandidates), + CallHangup => from_value(value, Event::CallHangup), + CallInvite => from_value(value, Event::CallInvite), + Direct => from_value(value, Event::Direct), + Dummy => from_value(value, Event::Dummy), + ForwardedRoomKey => from_value(value, Event::ForwardedRoomKey), + FullyRead => from_value(value, Event::FullyRead), + IgnoredUserList => from_value(value, Event::IgnoredUserList), + KeyVerificationAccept => from_value(value, Event::KeyVerificationAccept), + KeyVerificationCancel => from_value(value, Event::KeyVerificationCancel), + KeyVerificationKey => from_value(value, Event::KeyVerificationKey), + KeyVerificationMac => from_value(value, Event::KeyVerificationMac), + KeyVerificationRequest => from_value(value, Event::KeyVerificationRequest), + KeyVerificationStart => from_value(value, Event::KeyVerificationStart), + Presence => from_value(value, Event::Presence), + PushRules => from_value(value, Event::PushRules), + Receipt => from_value(value, Event::Receipt), + RoomAliases => from_value(value, Event::RoomAliases), + RoomAvatar => from_value(value, Event::RoomAvatar), + RoomCanonicalAlias => from_value(value, Event::RoomCanonicalAlias), + RoomCreate => from_value(value, Event::RoomCreate), + RoomEncrypted => from_value(value, Event::RoomEncrypted), + RoomEncryption => from_value(value, Event::RoomEncryption), + RoomGuestAccess => from_value(value, Event::RoomGuestAccess), + RoomHistoryVisibility => from_value(value, Event::RoomHistoryVisibility), + RoomJoinRules => from_value(value, Event::RoomJoinRules), + RoomMember => from_value(value, Event::RoomMember), + RoomMessage => from_value(value, Event::RoomMessage), + RoomMessageFeedback => from_value(value, Event::RoomMessageFeedback), + RoomName => from_value(value, Event::RoomName), + RoomPinnedEvents => from_value(value, Event::RoomPinnedEvents), + RoomPowerLevels => from_value(value, Event::RoomPowerLevels), + RoomRedaction => from_value(value, Event::RoomRedaction), + RoomServerAcl => from_value(value, Event::RoomServerAcl), + RoomThirdPartyInvite => from_value(value, Event::RoomThirdPartyInvite), + RoomTombstone => from_value(value, Event::RoomTombstone), + RoomTopic => from_value(value, Event::RoomTopic), + RoomKey => from_value(value, Event::RoomKey), + RoomKeyRequest => from_value(value, Event::RoomKeyRequest), + Sticker => from_value(value, Event::Sticker), + Tag => from_value(value, Event::Tag), + Typing => from_value(value, Event::Typing), // TODO Custom(_event_type_name) => Err(D::Error::custom("invalid event type")), __Nonexhaustive => { @@ -450,83 +405,38 @@ impl<'de> Deserialize<'de> for RoomEvent { where D: Deserializer<'de>, { + use crate::util::try_variant_from_value as from_value; use EventType::*; let value = Value::deserialize(deserializer)?; let event_type = get_field(&value, "type")?; match event_type { - CallAnswer => from_value(value) - .map(RoomEvent::CallAnswer) - .map_err(conv_err), - CallCandidates => from_value(value) - .map(RoomEvent::CallCandidates) - .map_err(conv_err), - CallHangup => from_value(value) - .map(RoomEvent::CallHangup) - .map_err(conv_err), - CallInvite => from_value(value) - .map(RoomEvent::CallInvite) - .map_err(conv_err), - RoomAliases => from_value(value) - .map(RoomEvent::RoomAliases) - .map_err(conv_err), - RoomAvatar => from_value(value) - .map(RoomEvent::RoomAvatar) - .map_err(conv_err), - RoomCanonicalAlias => from_value(value) - .map(RoomEvent::RoomCanonicalAlias) - .map_err(conv_err), - RoomCreate => from_value(value) - .map(RoomEvent::RoomCreate) - .map_err(conv_err), - RoomEncrypted => from_value(value) - .map(RoomEvent::RoomEncrypted) - .map_err(conv_err), - RoomEncryption => from_value(value) - .map(RoomEvent::RoomEncryption) - .map_err(conv_err), - RoomGuestAccess => from_value(value) - .map(RoomEvent::RoomGuestAccess) - .map_err(conv_err), - RoomHistoryVisibility => from_value(value) - .map(RoomEvent::RoomHistoryVisibility) - .map_err(conv_err), - RoomJoinRules => from_value(value) - .map(RoomEvent::RoomJoinRules) - .map_err(conv_err), - RoomMember => from_value(value) - .map(RoomEvent::RoomMember) - .map_err(conv_err), - RoomMessage => from_value(value) - .map(RoomEvent::RoomMessage) - .map_err(conv_err), - RoomMessageFeedback => from_value(value) - .map(RoomEvent::RoomMessageFeedback) - .map_err(conv_err), - RoomName => from_value(value).map(RoomEvent::RoomName).map_err(conv_err), - RoomPinnedEvents => from_value(value) - .map(RoomEvent::RoomPinnedEvents) - .map_err(conv_err), - RoomPowerLevels => from_value(value) - .map(RoomEvent::RoomPowerLevels) - .map_err(conv_err), - RoomRedaction => from_value(value) - .map(RoomEvent::RoomRedaction) - .map_err(conv_err), - RoomServerAcl => from_value(value) - .map(RoomEvent::RoomServerAcl) - .map_err(conv_err), - RoomThirdPartyInvite => from_value(value) - .map(RoomEvent::RoomThirdPartyInvite) - .map_err(conv_err), - RoomTombstone => from_value(value) - .map(RoomEvent::RoomTombstone) - .map_err(conv_err), - RoomTopic => from_value(value) - .map(RoomEvent::RoomTopic) - .map_err(conv_err), - Sticker => from_value(value).map(RoomEvent::Sticker).map_err(conv_err), + CallAnswer => from_value(value, RoomEvent::CallAnswer), + CallCandidates => from_value(value, RoomEvent::CallCandidates), + CallHangup => from_value(value, RoomEvent::CallHangup), + CallInvite => from_value(value, RoomEvent::CallInvite), + RoomAliases => from_value(value, RoomEvent::RoomAliases), + RoomAvatar => from_value(value, RoomEvent::RoomAvatar), + RoomCanonicalAlias => from_value(value, RoomEvent::RoomCanonicalAlias), + RoomCreate => from_value(value, RoomEvent::RoomCreate), + RoomEncrypted => from_value(value, RoomEvent::RoomEncrypted), + RoomEncryption => from_value(value, RoomEvent::RoomEncryption), + RoomGuestAccess => from_value(value, RoomEvent::RoomGuestAccess), + RoomHistoryVisibility => from_value(value, RoomEvent::RoomHistoryVisibility), + RoomJoinRules => from_value(value, RoomEvent::RoomJoinRules), + RoomMember => from_value(value, RoomEvent::RoomMember), + RoomMessage => from_value(value, RoomEvent::RoomMessage), + RoomMessageFeedback => from_value(value, RoomEvent::RoomMessageFeedback), + RoomName => from_value(value, RoomEvent::RoomName), + RoomPinnedEvents => from_value(value, RoomEvent::RoomPinnedEvents), + RoomPowerLevels => from_value(value, RoomEvent::RoomPowerLevels), + RoomRedaction => from_value(value, RoomEvent::RoomRedaction), + RoomServerAcl => from_value(value, RoomEvent::RoomServerAcl), + RoomThirdPartyInvite => from_value(value, RoomEvent::RoomThirdPartyInvite), + RoomTombstone => from_value(value, RoomEvent::RoomTombstone), + RoomTopic => from_value(value, RoomEvent::RoomTopic), + Sticker => from_value(value, RoomEvent::Sticker), //Custom(_event_type_name) => unimplemented!("todo"), _ => Err(D::Error::custom("invalid event type")), } @@ -538,60 +448,29 @@ impl<'de> Deserialize<'de> for StateEvent { where D: Deserializer<'de>, { + use crate::util::try_variant_from_value as from_value; use EventType::*; let value = Value::deserialize(deserializer)?; let event_type = get_field(&value, "type")?; match event_type { - RoomAliases => from_value(value) - .map(StateEvent::RoomAliases) - .map_err(conv_err), - RoomAvatar => from_value(value) - .map(StateEvent::RoomAvatar) - .map_err(conv_err), - RoomCanonicalAlias => from_value(value) - .map(StateEvent::RoomCanonicalAlias) - .map_err(conv_err), - RoomCreate => from_value(value) - .map(StateEvent::RoomCreate) - .map_err(conv_err), - RoomEncryption => from_value(value) - .map(StateEvent::RoomEncryption) - .map_err(conv_err), - RoomGuestAccess => from_value(value) - .map(StateEvent::RoomGuestAccess) - .map_err(conv_err), - RoomHistoryVisibility => from_value(value) - .map(StateEvent::RoomHistoryVisibility) - .map_err(conv_err), - RoomJoinRules => from_value(value) - .map(StateEvent::RoomJoinRules) - .map_err(conv_err), - RoomMember => from_value(value) - .map(StateEvent::RoomMember) - .map_err(conv_err), - RoomName => from_value(value) - .map(StateEvent::RoomName) - .map_err(conv_err), - RoomPinnedEvents => from_value(value) - .map(StateEvent::RoomPinnedEvents) - .map_err(conv_err), - RoomPowerLevels => from_value(value) - .map(StateEvent::RoomPowerLevels) - .map_err(conv_err), - RoomServerAcl => from_value(value) - .map(StateEvent::RoomServerAcl) - .map_err(conv_err), - RoomThirdPartyInvite => from_value(value) - .map(StateEvent::RoomThirdPartyInvite) - .map_err(conv_err), - RoomTombstone => from_value(value) - .map(StateEvent::RoomTombstone) - .map_err(conv_err), - RoomTopic => from_value(value) - .map(StateEvent::RoomTopic) - .map_err(conv_err), + RoomAliases => from_value(value, StateEvent::RoomAliases), + RoomAvatar => from_value(value, StateEvent::RoomAvatar), + RoomCanonicalAlias => from_value(value, StateEvent::RoomCanonicalAlias), + RoomCreate => from_value(value, StateEvent::RoomCreate), + RoomEncryption => from_value(value, StateEvent::RoomEncryption), + RoomGuestAccess => from_value(value, StateEvent::RoomGuestAccess), + RoomHistoryVisibility => from_value(value, StateEvent::RoomHistoryVisibility), + RoomJoinRules => from_value(value, StateEvent::RoomJoinRules), + RoomMember => from_value(value, StateEvent::RoomMember), + RoomName => from_value(value, StateEvent::RoomName), + RoomPinnedEvents => from_value(value, StateEvent::RoomPinnedEvents), + RoomPowerLevels => from_value(value, StateEvent::RoomPowerLevels), + RoomServerAcl => from_value(value, StateEvent::RoomServerAcl), + RoomThirdPartyInvite => from_value(value, StateEvent::RoomThirdPartyInvite), + RoomTombstone => from_value(value, StateEvent::RoomTombstone), + RoomTopic => from_value(value, StateEvent::RoomTopic), //Custom(_event_type_name) => unimplemented!("todo"), _ => Err(D::Error::custom("invalid event type")), } diff --git a/src/collections/raw/only.rs b/src/collections/raw/only.rs index 53a3588e..75d5a184 100644 --- a/src/collections/raw/only.rs +++ b/src/collections/raw/only.rs @@ -2,7 +2,7 @@ //! most" the trait of the same name. use serde::{de::Error as _, Deserialize, Deserializer}; -use serde_json::{from_value, Value}; +use serde_json::Value; pub use super::all::StateEvent; use crate::{ @@ -32,7 +32,7 @@ use crate::{ sticker::raw::StickerEvent, tag::raw::TagEvent, typing::raw::TypingEvent, - util::{get_field, serde_json_error_to_generic_de_error as conv_err}, + util::get_field, CustomEvent, CustomRoomEvent, EventType, }; @@ -148,48 +148,31 @@ impl<'de> Deserialize<'de> for Event { where D: Deserializer<'de>, { + use crate::util::try_variant_from_value as from_value; use EventType::*; let value = Value::deserialize(deserializer)?; let event_type = get_field(&value, "type")?; match event_type { - Direct => from_value(value).map(Event::Direct).map_err(conv_err), - Dummy => from_value(value).map(Event::Dummy).map_err(conv_err), - ForwardedRoomKey => from_value(value) - .map(Event::ForwardedRoomKey) - .map_err(conv_err), - FullyRead => from_value(value).map(Event::FullyRead).map_err(conv_err), - KeyVerificationAccept => from_value(value) - .map(Event::KeyVerificationAccept) - .map_err(conv_err), - KeyVerificationCancel => from_value(value) - .map(Event::KeyVerificationCancel) - .map_err(conv_err), - KeyVerificationKey => from_value(value) - .map(Event::KeyVerificationKey) - .map_err(conv_err), - KeyVerificationMac => from_value(value) - .map(Event::KeyVerificationMac) - .map_err(conv_err), - KeyVerificationRequest => from_value(value) - .map(Event::KeyVerificationRequest) - .map_err(conv_err), - KeyVerificationStart => from_value(value) - .map(Event::KeyVerificationStart) - .map_err(conv_err), - IgnoredUserList => from_value(value) - .map(Event::IgnoredUserList) - .map_err(conv_err), - Presence => from_value(value).map(Event::Presence).map_err(conv_err), - PushRules => from_value(value).map(Event::PushRules).map_err(conv_err), - RoomKey => from_value(value).map(Event::RoomKey).map_err(conv_err), - RoomKeyRequest => from_value(value) - .map(Event::RoomKeyRequest) - .map_err(conv_err), - Receipt => from_value(value).map(Event::Receipt).map_err(conv_err), - Tag => from_value(value).map(Event::Tag).map_err(conv_err), - Typing => from_value(value).map(Event::Typing).map_err(conv_err), + Direct => from_value(value, Event::Direct), + Dummy => from_value(value, Event::Dummy), + ForwardedRoomKey => from_value(value, Event::ForwardedRoomKey), + FullyRead => from_value(value, Event::FullyRead), + KeyVerificationAccept => from_value(value, Event::KeyVerificationAccept), + KeyVerificationCancel => from_value(value, Event::KeyVerificationCancel), + KeyVerificationKey => from_value(value, Event::KeyVerificationKey), + KeyVerificationMac => from_value(value, Event::KeyVerificationMac), + KeyVerificationRequest => from_value(value, Event::KeyVerificationRequest), + KeyVerificationStart => from_value(value, Event::KeyVerificationStart), + IgnoredUserList => from_value(value, Event::IgnoredUserList), + Presence => from_value(value, Event::Presence), + PushRules => from_value(value, Event::PushRules), + RoomKey => from_value(value, Event::RoomKey), + RoomKeyRequest => from_value(value, Event::RoomKeyRequest), + Receipt => from_value(value, Event::Receipt), + Tag => from_value(value, Event::Tag), + Typing => from_value(value, Event::Typing), //Custom(_event_type_name) => unimplemented!("todo"), _ => Err(D::Error::custom("invalid event type")), } @@ -201,37 +184,22 @@ impl<'de> Deserialize<'de> for RoomEvent { where D: Deserializer<'de>, { + use crate::util::try_variant_from_value as from_value; use EventType::*; let value = Value::deserialize(deserializer)?; let event_type = get_field(&value, "type")?; match event_type { - CallAnswer => from_value(value) - .map(RoomEvent::CallAnswer) - .map_err(conv_err), - CallCandidates => from_value(value) - .map(RoomEvent::CallCandidates) - .map_err(conv_err), - CallHangup => from_value(value) - .map(RoomEvent::CallHangup) - .map_err(conv_err), - CallInvite => from_value(value) - .map(RoomEvent::CallInvite) - .map_err(conv_err), - RoomEncrypted => from_value(value) - .map(RoomEvent::RoomEncrypted) - .map_err(conv_err), - RoomMessage => from_value(value) - .map(RoomEvent::RoomMessage) - .map_err(conv_err), - RoomMessageFeedback => from_value(value) - .map(RoomEvent::RoomMessageFeedback) - .map_err(conv_err), - RoomRedaction => from_value(value) - .map(RoomEvent::RoomRedaction) - .map_err(conv_err), - Sticker => from_value(value).map(RoomEvent::Sticker).map_err(conv_err), + CallAnswer => from_value(value, RoomEvent::CallAnswer), + CallCandidates => from_value(value, RoomEvent::CallCandidates), + CallHangup => from_value(value, RoomEvent::CallHangup), + CallInvite => from_value(value, RoomEvent::CallInvite), + RoomEncrypted => from_value(value, RoomEvent::RoomEncrypted), + RoomMessage => from_value(value, RoomEvent::RoomMessage), + RoomMessageFeedback => from_value(value, RoomEvent::RoomMessageFeedback), + RoomRedaction => from_value(value, RoomEvent::RoomRedaction), + Sticker => from_value(value, RoomEvent::Sticker), //Custom(_event_type_name) => unimplemented!("todo"), _ => Err(D::Error::custom("invalid event type")), } diff --git a/src/stripped.rs b/src/stripped.rs index 310d25f2..214b19c7 100644 --- a/src/stripped.rs +++ b/src/stripped.rs @@ -219,14 +219,17 @@ mod raw { use serde_json::Value; use super::StrippedStateContent; - use crate::room::{ - aliases::raw::AliasesEventContent, avatar::raw::AvatarEventContent, - canonical_alias::raw::CanonicalAliasEventContent, create::raw::CreateEventContent, - guest_access::raw::GuestAccessEventContent, - history_visibility::raw::HistoryVisibilityEventContent, - join_rules::raw::JoinRulesEventContent, member::raw::MemberEventContent, - name::raw::NameEventContent, power_levels::raw::PowerLevelsEventContent, - third_party_invite::raw::ThirdPartyInviteEventContent, topic::raw::TopicEventContent, + use crate::{ + room::{ + aliases::raw::AliasesEventContent, avatar::raw::AvatarEventContent, + canonical_alias::raw::CanonicalAliasEventContent, create::raw::CreateEventContent, + guest_access::raw::GuestAccessEventContent, + history_visibility::raw::HistoryVisibilityEventContent, + join_rules::raw::JoinRulesEventContent, member::raw::MemberEventContent, + name::raw::NameEventContent, power_levels::raw::PowerLevelsEventContent, + third_party_invite::raw::ThirdPartyInviteEventContent, topic::raw::TopicEventContent, + }, + util::get_field, }; /// A stripped-down version of the *m.room.aliases* event. @@ -311,54 +314,26 @@ mod raw { where D: Deserializer<'de>, { - use crate::{ - util::{get_field, serde_json_error_to_generic_de_error as conv_err}, - EventType::*, - }; + use crate::{util::try_variant_from_value as from_value, EventType::*}; use serde::de::Error as _; - use serde_json::from_value; // TODO: Optimize let value = Value::deserialize(deserializer)?; let event_type = get_field(&value, "type")?; match event_type { - RoomAliases => from_value(value) - .map(StrippedState::RoomAliases) - .map_err(conv_err), - RoomAvatar => from_value(value) - .map(StrippedState::RoomAvatar) - .map_err(conv_err), - RoomCanonicalAlias => from_value(value) - .map(StrippedState::RoomCanonicalAlias) - .map_err(conv_err), - RoomCreate => from_value(value) - .map(StrippedState::RoomCreate) - .map_err(conv_err), - RoomGuestAccess => from_value(value) - .map(StrippedState::RoomGuestAccess) - .map_err(conv_err), - RoomHistoryVisibility => from_value(value) - .map(StrippedState::RoomHistoryVisibility) - .map_err(conv_err), - RoomJoinRules => from_value(value) - .map(StrippedState::RoomJoinRules) - .map_err(conv_err), - RoomMember => from_value(value) - .map(StrippedState::RoomMember) - .map_err(conv_err), - RoomName => from_value(value) - .map(StrippedState::RoomName) - .map_err(conv_err), - RoomPowerLevels => from_value(value) - .map(StrippedState::RoomPowerLevels) - .map_err(conv_err), - RoomThirdPartyInvite => from_value(value) - .map(StrippedState::RoomThirdPartyInvite) - .map_err(conv_err), - RoomTopic => from_value(value) - .map(StrippedState::RoomTopic) - .map_err(conv_err), + RoomAliases => from_value(value, StrippedState::RoomAliases), + RoomAvatar => from_value(value, StrippedState::RoomAvatar), + RoomCanonicalAlias => from_value(value, StrippedState::RoomCanonicalAlias), + RoomCreate => from_value(value, StrippedState::RoomCreate), + RoomGuestAccess => from_value(value, StrippedState::RoomGuestAccess), + RoomHistoryVisibility => from_value(value, StrippedState::RoomHistoryVisibility), + RoomJoinRules => from_value(value, StrippedState::RoomJoinRules), + RoomMember => from_value(value, StrippedState::RoomMember), + RoomName => from_value(value, StrippedState::RoomName), + RoomPowerLevels => from_value(value, StrippedState::RoomPowerLevels), + RoomThirdPartyInvite => from_value(value, StrippedState::RoomThirdPartyInvite), + RoomTopic => from_value(value, StrippedState::RoomTopic), _ => Err(D::Error::custom("not a state event")), } } diff --git a/src/util.rs b/src/util.rs index 7305422a..0627d266 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,4 +1,5 @@ use serde::de::{Deserialize, DeserializeOwned, IntoDeserializer}; +use serde_json::Value; use crate::TryFromRaw; @@ -12,14 +13,25 @@ pub fn try_convert_variant( .map_err(|(err, raw)| (err.to_string(), raw_variant(raw))) } +pub fn try_variant_from_value(value: Value, variant: fn(T) -> U) -> Result +where + T: DeserializeOwned, + E: serde::de::Error, +{ + serde_json::from_value(value) + .map(variant) + .map_err(serde_json_error_to_generic_de_error) +} + pub fn serde_json_error_to_generic_de_error(error: serde_json::Error) -> E { E::custom(error.to_string()) } -pub fn get_field( - value: &serde_json::Value, - field: &'static str, -) -> Result { +pub fn get_field(value: &Value, field: &'static str) -> Result +where + T: DeserializeOwned, + E: serde::de::Error, +{ serde_json::from_value( value .get(field)