diff --git a/ruma-events-macros/src/from_raw.rs b/ruma-events-macros/src/from_raw.rs deleted file mode 100644 index b1f6e391..00000000 --- a/ruma-events-macros/src/from_raw.rs +++ /dev/null @@ -1,64 +0,0 @@ -//! Implementation of the `FromRaw` derive macro - -use proc_macro2::TokenStream; -use quote::{quote, quote_spanned}; -use syn::{spanned::Spanned, Data, DeriveInput, Fields}; - -/// Create a `FromRaw` implementation for a struct -pub fn expand_from_raw(input: DeriveInput) -> syn::Result { - let fields = match input.data { - Data::Struct(s) => match s.fields { - Fields::Named(fs) => fs.named, - _ => panic!("#[derive(FromRaw)] only supports structs with named fields!"), - }, - _ => panic!("#[derive(FromRaw)] only supports structs!"), - }; - let ident = &input.ident; - - let raw_content = { - let fields = fields.iter(); - quote! { - #[derive(Clone, Debug, serde::Deserialize)] - pub struct #ident { - #(#fields),* - } - } - }; - - let init_list = fields.iter().map(|field| { - let field_ident = field.ident.as_ref().unwrap(); - let field_span = field.span(); - - if field_ident == "content" { - quote_spanned! {field_span=> - content: ::ruma_events::FromRaw::from_raw(raw.content), - } - } else if field_ident == "prev_content" { - quote_spanned! {field_span=> - prev_content: raw.prev_content.map(::ruma_events::FromRaw::from_raw), - } - } else { - quote_spanned! {field_span=> - #field_ident: raw.#field_ident, - } - } - }); - - Ok(quote! { - impl ::ruma_events::FromRaw for #ident { - type Raw = raw::#ident; - - fn from_raw(raw: raw::#ident) -> Self { - Self { - #(#init_list)* - } - } - } - - pub(crate) mod raw { - use super::*; - - #raw_content - } - }) -} diff --git a/ruma-events-macros/src/gen.rs b/ruma-events-macros/src/gen.rs index c9a65d7d..5e80ef6d 100644 --- a/ruma-events-macros/src/gen.rs +++ b/ruma-events-macros/src/gen.rs @@ -83,7 +83,7 @@ impl ToTokens for RumaEvent { Content::Struct(fields) => { quote! { #[doc = #content_docstring] - #[derive(Clone, Debug, ::serde::Serialize, ::ruma_events_macros::FromRaw)] + #[derive(Clone, Debug, ::serde::Serialize, ::serde::Deserialize)] pub struct #content_name { #(#fields),* } diff --git a/ruma-events-macros/src/lib.rs b/ruma-events-macros/src/lib.rs index fc0d2ad7..ede5d4c0 100644 --- a/ruma-events-macros/src/lib.rs +++ b/ruma-events-macros/src/lib.rs @@ -18,7 +18,6 @@ use self::{ content_enum::{expand_content_enum, parse::ContentEnumInput}, event::expand_event, event_content::{expand_message_event_content, expand_state_event_content}, - from_raw::expand_from_raw, gen::RumaEvent, parse::RumaEventInput, }; @@ -26,7 +25,6 @@ use self::{ mod content_enum; mod event; mod event_content; -mod from_raw; mod gen; mod parse; @@ -136,17 +134,6 @@ pub fn event_content_enum(input: TokenStream) -> TokenStream { .into() } -/// Generates an implementation of `ruma_events::FromRaw`. Only usable inside of `ruma_events`. -/// Requires there to be a `raw` module in the same scope, with a type with the same name and fields -/// as the one that this macro is used on. -#[proc_macro_derive(FromRaw)] -pub fn derive_from_raw(input: TokenStream) -> TokenStream { - let input = parse_macro_input!(input as DeriveInput); - expand_from_raw(input) - .unwrap_or_else(|err| err.to_compile_error()) - .into() -} - /// Generates an implementation of `ruma_events::MessageEventContent` and it's super traits. #[proc_macro_derive(MessageEventContent, attributes(ruma_event))] pub fn derive_message_event_content(input: TokenStream) -> TokenStream { diff --git a/src/call/candidates.rs b/src/call/candidates.rs index 1a6a90e5..b3ef0add 100644 --- a/src/call/candidates.rs +++ b/src/call/candidates.rs @@ -1,7 +1,7 @@ //! Types for the *m.call.candidates* event. use js_int::UInt; -use ruma_events_macros::{FromRaw, MessageEventContent}; +use ruma_events_macros::MessageEventContent; use serde::{Deserialize, Serialize}; /// This event is sent by callers after sending an invite and by the callee after answering. Its diff --git a/src/call/hangup.rs b/src/call/hangup.rs index a2fdaa0e..83abeb74 100644 --- a/src/call/hangup.rs +++ b/src/call/hangup.rs @@ -1,7 +1,7 @@ //! Types for the *m.call.hangup* event. use js_int::UInt; -use ruma_events_macros::{FromRaw, MessageEventContent}; +use ruma_events_macros::MessageEventContent; use serde::{Deserialize, Serialize}; use strum::{Display, EnumString}; diff --git a/src/event_kinds.rs b/src/event_kinds.rs index be0d71a5..17362874 100644 --- a/src/event_kinds.rs +++ b/src/event_kinds.rs @@ -13,7 +13,7 @@ use serde::{ use crate::{ BasicEventContent, MessageEventContent, RoomEventContent, StateEventContent, - ToDeviceEventContent, TryFromRaw, UnsignedData, + ToDeviceEventContent, UnsignedData, }; /// A basic event – one that consists only of it's type and the `content` object. diff --git a/src/from_raw.rs b/src/from_raw.rs deleted file mode 100644 index 2a94ba50..00000000 --- a/src/from_raw.rs +++ /dev/null @@ -1,64 +0,0 @@ -use std::{collections::BTreeMap, convert::Infallible, fmt::Display}; - -use serde::de::DeserializeOwned; - -/// See [`TryFromRaw`][try]. This trait is merely a convenience that is be implemented instead of -/// [`TryFromRaw`][try] to get a [`TryFromRaw`][try] implementation with slightly less code if the -/// conversion can't fail, that is, the raw type and `Self` are identical in definition. -/// -/// [try]: trait.TryFromRaw.html -pub trait FromRaw: Sized { - /// The raw type. - type Raw; - - /// Converts the raw type to `Self`. - fn from_raw(_: Self::Raw) -> Self; -} - -/// Types corresponding to some item in the matrix spec. Types that implement this trait have a -/// corresponding 'raw' type, a potentially invalid representation that can be converted to `Self`. -pub trait TryFromRaw: Sized { - /// The raw type. - type Raw; - /// The error type returned if conversion fails. - type Err: Display; - - /// Tries to convert the raw type to `Self`. - fn try_from_raw(_: Self::Raw) -> Result; -} - -impl FromRaw for ruma_serde::empty::Empty { - type Raw = Self; - - fn from_raw(raw: Self) -> Self { - raw - } -} - -impl FromRaw for serde_json::Value { - type Raw = Self; - - fn from_raw(raw: Self) -> Self { - raw - } -} - -impl FromRaw for BTreeMap -where - Self: DeserializeOwned, -{ - type Raw = Self; - - fn from_raw(raw: Self) -> Self { - raw - } -} - -impl TryFromRaw for T { - type Raw = ::Raw; - type Err = Infallible; - - fn try_from_raw(raw: Self::Raw) -> Result { - Ok(Self::from_raw(raw)) - } -} diff --git a/src/key/verification/start.rs b/src/key/verification/start.rs index e7abb8a1..ff3a4e0f 100644 --- a/src/key/verification/start.rs +++ b/src/key/verification/start.rs @@ -6,7 +6,7 @@ use serde::{Deserialize, Serialize}; use super::{ HashAlgorithm, KeyAgreementProtocol, MessageAuthenticationCode, ShortAuthenticationString, }; -use crate::{InvalidInput, TryFromRaw}; +use crate::InvalidInput; /// Begins an SAS key verification process. /// @@ -27,83 +27,6 @@ pub enum StartEventContent { MSasV1(MSasV1Content), } -impl TryFromRaw for StartEvent { - type Raw = raw::StartEvent; - type Err = &'static str; - - fn try_from_raw(raw: raw::StartEvent) -> Result { - StartEventContent::try_from_raw(raw.content).map(|content| Self { content }) - } -} - -impl TryFromRaw for StartEventContent { - type Raw = raw::StartEventContent; - type Err = &'static str; - - fn try_from_raw(raw: raw::StartEventContent) -> Result { - match raw { - raw::StartEventContent::MSasV1(content) => { - if !content - .key_agreement_protocols - .contains(&KeyAgreementProtocol::Curve25519) - { - return Err( - "`key_agreement_protocols` must contain at least `KeyAgreementProtocol::Curve25519`" - ); - } - - if !content.hashes.contains(&HashAlgorithm::Sha256) { - return Err("`hashes` must contain at least `HashAlgorithm::Sha256`"); - } - - if !content - .message_authentication_codes - .contains(&MessageAuthenticationCode::HkdfHmacSha256) - { - return Err( - "`message_authentication_codes` must contain at least `MessageAuthenticationCode::HkdfHmacSha256`" - ); - } - - if !content - .short_authentication_string - .contains(&ShortAuthenticationString::Decimal) - { - return Err( - "`short_authentication_string` must contain at least `ShortAuthenticationString::Decimal`", - ); - } - - Ok(StartEventContent::MSasV1(content)) - } - } - } -} - -pub(crate) mod raw { - use serde::Deserialize; - - use super::MSasV1Content; - - /// Begins an SAS key verification process. - /// - /// Typically sent as a to-device event. - #[derive(Clone, Debug, Deserialize)] - pub struct StartEvent { - /// The event's content. - pub content: StartEventContent, - } - - /// The payload of an *m.key.verification.start* event. - #[derive(Clone, Debug, Deserialize)] - #[serde(tag = "method")] - pub enum StartEventContent { - /// The *m.sas.v1* verification method. - #[serde(rename = "m.sas.v1")] - MSasV1(MSasV1Content), - } -} - /// The payload of an *m.key.verification.start* event using the *m.sas.v1* method. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct MSasV1Content { diff --git a/src/lib.rs b/src/lib.rs index 094b5151..587d914c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -135,7 +135,6 @@ mod error; mod event_enums; mod event_kinds; mod event_type; -mod from_raw; mod json; #[doc(hidden)] // only public for external tests pub mod util; @@ -171,7 +170,6 @@ pub use self::{ event_enums::AnyStateEvent, event_kinds::{MessageEvent, StateEvent}, event_type::EventType, - from_raw::{FromRaw, TryFromRaw}, json::EventJson, }; diff --git a/src/room/create.rs b/src/room/create.rs index 02204076..765f2d51 100644 --- a/src/room/create.rs +++ b/src/room/create.rs @@ -2,7 +2,7 @@ use std::convert::TryFrom; -use ruma_events_macros::{FromRaw, StateEventContent}; +use ruma_events_macros::StateEventContent; use ruma_identifiers::{EventId, RoomId, RoomVersionId, UserId}; use serde::{Deserialize, Serialize}; diff --git a/src/room/encrypted.rs b/src/room/encrypted.rs index 2d1202a9..5f07e57a 100644 --- a/src/room/encrypted.rs +++ b/src/room/encrypted.rs @@ -6,7 +6,7 @@ use js_int::UInt; use ruma_identifiers::{DeviceId, EventId, RoomId, UserId}; use serde::{Deserialize, Serialize}; -use crate::{FromRaw, UnsignedData}; +use crate::UnsignedData; /// The payload for `EncryptedEvent`. #[derive(Clone, Debug, Deserialize, Serialize)] diff --git a/src/room/encryption.rs b/src/room/encryption.rs index c676530b..fa918040 100644 --- a/src/room/encryption.rs +++ b/src/room/encryption.rs @@ -1,7 +1,7 @@ //! Types for the *m.room.encryption* event. use js_int::UInt; -use ruma_events_macros::{FromRaw, StateEventContent}; +use ruma_events_macros::StateEventContent; use serde::{Deserialize, Serialize}; use crate::Algorithm; diff --git a/src/room/guest_access.rs b/src/room/guest_access.rs index 37a29d72..c8fd8341 100644 --- a/src/room/guest_access.rs +++ b/src/room/guest_access.rs @@ -1,6 +1,6 @@ //! Types for the *m.room.guest_access* event. -use ruma_events_macros::{FromRaw, StateEventContent}; +use ruma_events_macros::StateEventContent; use serde::{Deserialize, Serialize}; use strum::{Display, EnumString}; diff --git a/src/room/history_visibility.rs b/src/room/history_visibility.rs index 56dd69d2..2e8da039 100644 --- a/src/room/history_visibility.rs +++ b/src/room/history_visibility.rs @@ -1,6 +1,6 @@ //! Types for the *m.room.history_visibility* event. -use ruma_events_macros::{FromRaw, StateEventContent}; +use ruma_events_macros::StateEventContent; use serde::{Deserialize, Serialize}; use strum::{Display, EnumString}; diff --git a/src/room/join_rules.rs b/src/room/join_rules.rs index dea0ce0d..9ae7ee25 100644 --- a/src/room/join_rules.rs +++ b/src/room/join_rules.rs @@ -1,6 +1,6 @@ //! Types for the *m.room.join_rules* event. -use ruma_events_macros::{FromRaw, StateEventContent}; +use ruma_events_macros::StateEventContent; use serde::{Deserialize, Serialize}; use strum::{Display, EnumString}; diff --git a/src/room/member.rs b/src/room/member.rs index dece9dd4..b86f01f6 100644 --- a/src/room/member.rs +++ b/src/room/member.rs @@ -2,7 +2,7 @@ use std::collections::BTreeMap; -use ruma_events_macros::{FromRaw, StateEventContent}; +use ruma_events_macros::StateEventContent; use ruma_identifiers::UserId; use serde::{Deserialize, Serialize}; use strum::{Display, EnumString}; diff --git a/src/room/message.rs b/src/room/message.rs index daa6d0a4..ce14f83d 100644 --- a/src/room/message.rs +++ b/src/room/message.rs @@ -8,7 +8,7 @@ use ruma_identifiers::{EventId, RoomId, UserId}; use serde::{Deserialize, Serialize}; use super::{EncryptedFile, ImageInfo, ThumbnailInfo}; -use crate::{FromRaw, UnsignedData}; +use crate::UnsignedData; pub mod feedback; @@ -54,82 +54,6 @@ pub enum MessageEventContent { Video(VideoMessageEventContent), } -impl FromRaw for MessageEventContent { - type Raw = raw::MessageEventContent; - - fn from_raw(raw: raw::MessageEventContent) -> Self { - use raw::MessageEventContent::*; - - match raw { - Audio(content) => MessageEventContent::Audio(content), - Emote(content) => MessageEventContent::Emote(content), - File(content) => MessageEventContent::File(content), - Image(content) => MessageEventContent::Image(content), - Location(content) => MessageEventContent::Location(content), - Notice(content) => MessageEventContent::Notice(content), - ServerNotice(content) => MessageEventContent::ServerNotice(content), - Text(content) => MessageEventContent::Text(content), - Video(content) => MessageEventContent::Video(content), - } - } -} - -pub(crate) mod raw { - use std::time::SystemTime; - - use ruma_identifiers::{EventId, RoomId, UserId}; - use serde::Deserialize; - - use super::{ - AudioMessageEventContent, EmoteMessageEventContent, FileMessageEventContent, - ImageMessageEventContent, LocationMessageEventContent, NoticeMessageEventContent, - ServerNoticeMessageEventContent, TextMessageEventContent, VideoMessageEventContent, - }; - use crate::UnsignedData; - - /// The payload for `MessageEvent`. - #[allow(clippy::large_enum_variant)] - #[derive(Clone, Debug, Deserialize)] - #[serde(tag = "msgtype")] - pub enum MessageEventContent { - /// An audio message. - #[serde(rename = "m.audio")] - Audio(AudioMessageEventContent), - - /// An emote message. - #[serde(rename = "m.emote")] - Emote(EmoteMessageEventContent), - - /// A file message. - #[serde(rename = "m.file")] - File(FileMessageEventContent), - - /// An image message. - #[serde(rename = "m.image")] - Image(ImageMessageEventContent), - - /// A location message. - #[serde(rename = "m.location")] - Location(LocationMessageEventContent), - - /// A notice message. - #[serde(rename = "m.notice")] - Notice(NoticeMessageEventContent), - - /// A server notice message. - #[serde(rename = "m.server_notice")] - ServerNotice(ServerNoticeMessageEventContent), - - /// An text message. - #[serde(rename = "m.text")] - Text(TextMessageEventContent), - - /// A video message. - #[serde(rename = "m.video")] - Video(VideoMessageEventContent), - } -} - /// The payload for an audio message. #[derive(Clone, Debug, Deserialize, Serialize)] pub struct AudioMessageEventContent { diff --git a/src/room/message/feedback.rs b/src/room/message/feedback.rs index ce755753..3b0b6bdd 100644 --- a/src/room/message/feedback.rs +++ b/src/room/message/feedback.rs @@ -1,6 +1,6 @@ //! Types for the *m.room.message.feedback* event. -use ruma_events_macros::{FromRaw, MessageEventContent}; +use ruma_events_macros::MessageEventContent; use ruma_identifiers::EventId; use serde::{Deserialize, Serialize}; use strum::{Display, EnumString}; diff --git a/src/room/power_levels.rs b/src/room/power_levels.rs index 5a446b3e..6fc45485 100644 --- a/src/room/power_levels.rs +++ b/src/room/power_levels.rs @@ -3,7 +3,7 @@ use std::collections::BTreeMap; use js_int::Int; -use ruma_events_macros::{FromRaw, StateEventContent}; +use ruma_events_macros::StateEventContent; use ruma_identifiers::UserId; use serde::{Deserialize, Serialize}; diff --git a/src/room/third_party_invite.rs b/src/room/third_party_invite.rs index 20a799f2..fbac559b 100644 --- a/src/room/third_party_invite.rs +++ b/src/room/third_party_invite.rs @@ -1,6 +1,6 @@ //! Types for the *m.room.third_party_invite* event. -use ruma_events_macros::{FromRaw, StateEventContent}; +use ruma_events_macros::StateEventContent; use serde::{Deserialize, Serialize}; /// An invitation to a room issued to a third party identifier, rather than a matrix user ID. diff --git a/src/util.rs b/src/util.rs index 5166405e..5736af7b 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,17 +1,6 @@ use serde::de::DeserializeOwned; use serde_json::Value as JsonValue; -use crate::TryFromRaw; - -pub fn try_convert_variant( - variant: fn(Content) -> Enum, - raw: Content::Raw, -) -> Result { - Content::try_from_raw(raw) - .map(variant) - .map_err(|err| err.to_string()) -} - pub fn try_variant_from_value(value: JsonValue, variant: fn(T) -> U) -> Result where T: DeserializeOwned,