events: Optimize deserialization helpers
This commit is contained in:
parent
4e72c374b9
commit
3b0afb520a
@ -161,10 +161,10 @@ fn expand_any_with_deser(
|
|||||||
use #serde::de::Error as _;
|
use #serde::de::Error as _;
|
||||||
|
|
||||||
let json = Box::<#serde_json::value::RawValue>::deserialize(deserializer)?;
|
let json = Box::<#serde_json::value::RawValue>::deserialize(deserializer)?;
|
||||||
let #ruma_events::EventDeHelper { ev_type, .. } =
|
let #ruma_events::EventTypeDeHelper { ev_type, .. } =
|
||||||
#ruma_events::from_raw_json_value(&json)?;
|
#ruma_events::from_raw_json_value(&json)?;
|
||||||
|
|
||||||
match ev_type.as_str() {
|
match &*ev_type {
|
||||||
#(
|
#(
|
||||||
#variant_attrs #events => {
|
#variant_attrs #events => {
|
||||||
let event = #serde_json::from_str::<#content>(json.get())
|
let event = #serde_json::from_str::<#content>(json.get())
|
||||||
@ -609,7 +609,7 @@ fn expand_redacted_enum(
|
|||||||
D: #serde::de::Deserializer<'de>,
|
D: #serde::de::Deserializer<'de>,
|
||||||
{
|
{
|
||||||
let json = Box::<#serde_json::value::RawValue>::deserialize(deserializer)?;
|
let json = Box::<#serde_json::value::RawValue>::deserialize(deserializer)?;
|
||||||
let #ruma_events::EventDeHelper { unsigned, .. } =
|
let #ruma_events::RedactionDeHelper { unsigned } =
|
||||||
#ruma_events::from_raw_json_value(&json)?;
|
#ruma_events::from_raw_json_value(&json)?;
|
||||||
|
|
||||||
Ok(match unsigned {
|
Ok(match unsigned {
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
use ruma_common::MilliSecondsSinceUnixEpoch;
|
use ruma_common::MilliSecondsSinceUnixEpoch;
|
||||||
use ruma_events_macros::event_enum;
|
use ruma_events_macros::event_enum;
|
||||||
use ruma_identifiers::{EventId, RoomId, RoomVersionId, UserId};
|
use ruma_identifiers::{EventId, RoomId, RoomVersionId, UserId};
|
||||||
use serde::{de, Serialize};
|
use serde::{de, Deserialize, Serialize};
|
||||||
use serde_json::value::RawValue as RawJsonValue;
|
use serde_json::value::RawValue as RawJsonValue;
|
||||||
|
|
||||||
use crate::{from_raw_json_value, room::redaction::SyncRedactionEvent, EventDeHelper, Redact};
|
use crate::{from_raw_json_value, room::redaction::SyncRedactionEvent, Redact, UnsignedDeHelper};
|
||||||
|
|
||||||
event_enum! {
|
event_enum! {
|
||||||
/// Any global account data event.
|
/// Any global account data event.
|
||||||
@ -197,13 +197,20 @@ impl AnySyncRoomEvent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'de> de::Deserialize<'de> for AnyRoomEvent {
|
#[derive(Deserialize)]
|
||||||
|
#[allow(clippy::exhaustive_structs)]
|
||||||
|
struct EventDeHelper {
|
||||||
|
pub state_key: Option<de::IgnoredAny>,
|
||||||
|
pub unsigned: Option<UnsignedDeHelper>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de> Deserialize<'de> for AnyRoomEvent {
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
where
|
where
|
||||||
D: de::Deserializer<'de>,
|
D: de::Deserializer<'de>,
|
||||||
{
|
{
|
||||||
let json = Box::<RawJsonValue>::deserialize(deserializer)?;
|
let json = Box::<RawJsonValue>::deserialize(deserializer)?;
|
||||||
let EventDeHelper { state_key, unsigned, .. } = from_raw_json_value(&json)?;
|
let EventDeHelper { state_key, unsigned } = from_raw_json_value(&json)?;
|
||||||
|
|
||||||
if state_key.is_some() {
|
if state_key.is_some() {
|
||||||
Ok(match unsigned {
|
Ok(match unsigned {
|
||||||
@ -223,13 +230,13 @@ impl<'de> de::Deserialize<'de> for AnyRoomEvent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'de> de::Deserialize<'de> for AnySyncRoomEvent {
|
impl<'de> Deserialize<'de> for AnySyncRoomEvent {
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
where
|
where
|
||||||
D: de::Deserializer<'de>,
|
D: de::Deserializer<'de>,
|
||||||
{
|
{
|
||||||
let json = Box::<RawJsonValue>::deserialize(deserializer)?;
|
let json = Box::<RawJsonValue>::deserialize(deserializer)?;
|
||||||
let EventDeHelper { state_key, unsigned, .. } = from_raw_json_value(&json)?;
|
let EventDeHelper { state_key, unsigned } = from_raw_json_value(&json)?;
|
||||||
|
|
||||||
if state_key.is_some() {
|
if state_key.is_some() {
|
||||||
Ok(match unsigned {
|
Ok(match unsigned {
|
||||||
|
@ -430,45 +430,36 @@ pub enum HasDeserializeFields {
|
|||||||
Optional,
|
Optional,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Helper struct to determine if the event has been redacted.
|
/// Helper struct to determine the event kind from a `serde_json::value::RawValue`.
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
#[derive(Debug, Deserialize)]
|
#[derive(Deserialize)]
|
||||||
|
#[allow(clippy::exhaustive_structs)]
|
||||||
|
pub struct EventTypeDeHelper<'a> {
|
||||||
|
#[serde(borrow, rename = "type")]
|
||||||
|
pub ev_type: std::borrow::Cow<'a, str>,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Helper struct to determine if an event has been redacted.
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct RedactionDeHelper {
|
||||||
|
/// Used to check whether redacted_because exists.
|
||||||
|
pub unsigned: Option<UnsignedDeHelper>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
#[derive(Deserialize)]
|
||||||
#[allow(clippy::exhaustive_structs)]
|
#[allow(clippy::exhaustive_structs)]
|
||||||
pub struct UnsignedDeHelper {
|
pub struct UnsignedDeHelper {
|
||||||
/// This is the field that signals an event has been redacted.
|
/// This is the field that signals an event has been redacted.
|
||||||
pub redacted_because: Option<IgnoredAny>,
|
pub redacted_because: Option<IgnoredAny>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Helper struct to determine the event kind from a `serde_json::value::RawValue`.
|
|
||||||
#[doc(hidden)]
|
|
||||||
#[derive(Debug, Deserialize)]
|
|
||||||
#[allow(clippy::exhaustive_structs)]
|
|
||||||
pub struct EventDeHelper {
|
|
||||||
/// the Matrix event type string "m.room.whatever".
|
|
||||||
#[serde(rename = "type")]
|
|
||||||
pub ev_type: String,
|
|
||||||
|
|
||||||
/// If `state_key` is present the event will be deserialized as a state event.
|
|
||||||
pub state_key: Option<IgnoredAny>,
|
|
||||||
|
|
||||||
/// If no `state_key` is found but an `event_id` is present the event
|
|
||||||
/// will be deserialized as a message event.
|
|
||||||
pub event_id: Option<IgnoredAny>,
|
|
||||||
|
|
||||||
/// If no `event_id` or `state_key` are found but a `room_id` is present
|
|
||||||
/// the event will be deserialized as an ephemeral event.
|
|
||||||
pub room_id: Option<IgnoredAny>,
|
|
||||||
|
|
||||||
/// If this `UnsignedData` contains a `redacted_because` key the event is
|
|
||||||
/// immediately deserialized as a redacted event.
|
|
||||||
pub unsigned: Option<UnsignedDeHelper>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Helper function for `serde_json::value::RawValue` deserialization.
|
/// Helper function for `serde_json::value::RawValue` deserialization.
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub fn from_raw_json_value<T, E>(val: &RawJsonValue) -> Result<T, E>
|
pub fn from_raw_json_value<'a, T, E>(val: &'a RawJsonValue) -> Result<T, E>
|
||||||
where
|
where
|
||||||
T: de::DeserializeOwned,
|
T: de::Deserialize<'a>,
|
||||||
E: de::Error,
|
E: de::Error,
|
||||||
{
|
{
|
||||||
serde_json::from_str(val.get()).map_err(E::custom)
|
serde_json::from_str(val.get()).map_err(E::custom)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user