events: Borrow raw JSON in EventContent::from_parts

This commit is contained in:
Jonas Platte 2021-05-15 14:58:35 +02:00
parent 16e8f498b4
commit 37899db3c5
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
6 changed files with 13 additions and 13 deletions

View File

@ -179,14 +179,14 @@ fn expand_deserialize_event(
let json = content.ok_or_else( let json = content.ok_or_else(
|| #serde::de::Error::missing_field("content"), || #serde::de::Error::missing_field("content"),
)?; )?;
C::from_parts(&event_type, json).map_err(A::Error::custom)? C::from_parts(&event_type, &json).map_err(A::Error::custom)?
}, },
#ruma_events::HasDeserializeFields::Optional => { #ruma_events::HasDeserializeFields::Optional => {
let json = content.unwrap_or( let json = content.unwrap_or(
#serde_json::value::RawValue::from_string("{}".to_owned()) #serde_json::value::RawValue::from_string("{}".to_owned())
.unwrap() .unwrap()
); );
C::from_parts(&event_type, json).map_err(A::Error::custom)? C::from_parts(&event_type, &json).map_err(A::Error::custom)?
}, },
}; };
} }
@ -194,7 +194,7 @@ fn expand_deserialize_event(
quote! { quote! {
let json = let json =
content.ok_or_else(|| #serde::de::Error::missing_field("content"))?; content.ok_or_else(|| #serde::de::Error::missing_field("content"))?;
let content = C::from_parts(&event_type, json).map_err(A::Error::custom)?; let content = C::from_parts(&event_type, &json).map_err(A::Error::custom)?;
} }
} else { } else {
quote! { quote! {
@ -207,7 +207,7 @@ fn expand_deserialize_event(
if is_generic { if is_generic {
quote! { quote! {
let prev_content = if let Some(json) = prev_content { let prev_content = if let Some(json) = prev_content {
Some(C::from_parts(&event_type, json).map_err(A::Error::custom)?) Some(C::from_parts(&event_type, &json).map_err(A::Error::custom)?)
} else { } else {
None None
}; };

View File

@ -345,7 +345,7 @@ fn generate_event_content_impl(
fn from_parts( fn from_parts(
ev_type: &str, ev_type: &str,
content: Box<#serde_json::value::RawValue> content: &#serde_json::value::RawValue,
) -> #serde_json::Result<Self> { ) -> #serde_json::Result<Self> {
if ev_type != #event_type { if ev_type != #event_type {
return Err(#serde::de::Error::custom( return Err(#serde::de::Error::custom(

View File

@ -411,7 +411,7 @@ fn expand_content_enum(
fn from_parts( fn from_parts(
event_type: &::std::primitive::str, event_type: &::std::primitive::str,
input: ::std::boxed::Box<#serde_json::value::RawValue>, input: &#serde_json::value::RawValue,
) -> #serde_json::Result<Self> { ) -> #serde_json::Result<Self> {
match event_type { match event_type {
#( #(

View File

@ -38,7 +38,7 @@ impl EventContent for CustomEventContent {
&self.event_type &self.event_type
} }
fn from_parts(event_type: &str, content: Box<RawJsonValue>) -> serde_json::Result<Self> { fn from_parts(event_type: &str, content: &RawJsonValue) -> serde_json::Result<Self> {
let data = serde_json::from_str(content.get())?; let data = serde_json::from_str(content.get())?;
Ok(Self { event_type: event_type.to_owned(), data }) Ok(Self { event_type: event_type.to_owned(), data })
} }
@ -75,7 +75,7 @@ impl EventContent for RedactedCustomEventContent {
&self.event_type &self.event_type
} }
fn from_parts(event_type: &str, _content: Box<RawJsonValue>) -> serde_json::Result<Self> { fn from_parts(event_type: &str, _content: &RawJsonValue) -> serde_json::Result<Self> {
Ok(Self { event_type: event_type.to_owned() }) Ok(Self { event_type: event_type.to_owned() })
} }
} }

View File

@ -253,7 +253,7 @@ pub trait EventContent: Sized + Serialize {
fn event_type(&self) -> &str; fn event_type(&self) -> &str;
/// Constructs the given event content. /// Constructs the given event content.
fn from_parts(event_type: &str, content: Box<RawJsonValue>) -> serde_json::Result<Self>; fn from_parts(event_type: &str, content: &RawJsonValue) -> serde_json::Result<Self>;
} }
/// Trait to define the behavior of redacting an event. /// Trait to define the behavior of redacting an event.
@ -285,12 +285,12 @@ pub trait RedactContent {
/// Extension trait for Raw<EventContent> /// Extension trait for Raw<EventContent>
pub trait RawExt<T: EventContent> { pub trait RawExt<T: EventContent> {
/// Try to deserialize the JSON as an event's content. /// Try to deserialize the JSON as an event's content.
fn deserialize_content(self, event_type: &str) -> serde_json::Result<T>; fn deserialize_content(&self, event_type: &str) -> serde_json::Result<T>;
} }
impl<T: EventContent> RawExt<T> for Raw<T> { impl<T: EventContent> RawExt<T> for Raw<T> {
fn deserialize_content(self, event_type: &str) -> serde_json::Result<T> { fn deserialize_content(&self, event_type: &str) -> serde_json::Result<T> {
T::from_parts(event_type, self.into_json()) T::from_parts(event_type, self.json())
} }
} }

View File

@ -63,7 +63,7 @@ impl EventContent for RedactedAliasesEventContent {
"m.room.aliases" "m.room.aliases"
} }
fn from_parts(event_type: &str, content: Box<RawJsonValue>) -> serde_json::Result<Self> { fn from_parts(event_type: &str, content: &RawJsonValue) -> serde_json::Result<Self> {
if event_type != "m.room.aliases" { if event_type != "m.room.aliases" {
return Err(::serde::de::Error::custom(format!( return Err(::serde::de::Error::custom(format!(
"expected event type `m.room.aliases`, found `{}`", "expected event type `m.room.aliases`, found `{}`",