Remove src/from_raw.rs and ruma-events-macro/src/from_raw.rs
This commit is contained in:
parent
8c271fb835
commit
ef3a6787a0
@ -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
|
||||
}
|
||||
})
|
||||
}
|
@ -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),*
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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};
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
@ -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 {
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
|
@ -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};
|
||||
|
||||
|
@ -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)]
|
||||
|
@ -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;
|
||||
|
@ -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};
|
||||
|
||||
|
@ -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};
|
||||
|
||||
|
@ -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};
|
||||
|
||||
|
@ -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};
|
||||
|
@ -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 {
|
||||
|
@ -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};
|
||||
|
@ -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};
|
||||
|
||||
|
@ -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.
|
||||
|
11
src/util.rs
11
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<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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user