Remove src/from_raw.rs and ruma-events-macro/src/from_raw.rs

This commit is contained in:
Ragotzy.devin 2020-06-07 16:21:04 -04:00 committed by GitHub
parent 8c271fb835
commit ef3a6787a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
21 changed files with 16 additions and 323 deletions

View File

@ -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<TokenStream> {
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
}
})
}

View File

@ -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),*
}

View File

@ -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 {

View File

@ -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

View File

@ -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};

View File

@ -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.

View File

@ -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<Self, Self::Err>;
}
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<K, V> FromRaw for BTreeMap<K, V>
where
Self: DeserializeOwned,
{
type Raw = Self;
fn from_raw(raw: Self) -> Self {
raw
}
}
impl<T: FromRaw> TryFromRaw for T {
type Raw = <T as FromRaw>::Raw;
type Err = Infallible;
fn try_from_raw(raw: Self::Raw) -> Result<Self, Self::Err> {
Ok(Self::from_raw(raw))
}
}

View File

@ -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<Self, Self::Err> {
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<Self, Self::Err> {
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 {

View File

@ -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,
};

View File

@ -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};

View File

@ -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)]

View File

@ -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;

View File

@ -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};

View File

@ -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};

View File

@ -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};

View File

@ -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};

View File

@ -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 {

View File

@ -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};

View File

@ -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};

View File

@ -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.

View File

@ -1,17 +1,6 @@
use serde::de::DeserializeOwned;
use serde_json::Value as JsonValue;
use crate::TryFromRaw;
pub fn try_convert_variant<Enum: TryFromRaw, Content: TryFromRaw>(
variant: fn(Content) -> Enum,
raw: Content::Raw,
) -> Result<Enum, String> {
Content::try_from_raw(raw)
.map(variant)
.map_err(|err| err.to_string())
}
pub fn try_variant_from_value<T, U, E>(value: JsonValue, variant: fn(T) -> U) -> Result<U, E>
where
T: DeserializeOwned,