events: Fix new_content serialization in the plain-text part of m.encrypted
This commit is contained in:
parent
3101be1f99
commit
6236b024fd
@ -10,7 +10,7 @@ use ruma_identifiers::EventId;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
use crate::{key::verification, reaction, room::message::Replacement};
|
||||
use crate::{key::verification, reaction};
|
||||
use crate::{
|
||||
room::message::{self, InReplyTo},
|
||||
MessageEvent,
|
||||
@ -95,6 +95,19 @@ pub enum Relation {
|
||||
Annotation(Annotation),
|
||||
}
|
||||
|
||||
/// The event this relation belongs to replaces another event.
|
||||
///
|
||||
/// In contrast to [`message::Replacement`], this struct doesn't store the new content, since that
|
||||
/// is part of the encrypted payload for `m.encrypted` events.
|
||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
#[cfg_attr(docsrs, doc(cfg(feature = "unstable-pre-spec")))]
|
||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||
pub struct Replacement {
|
||||
/// The ID of the event being replacing.
|
||||
pub event_id: EventId,
|
||||
}
|
||||
|
||||
/// A reference to another event.
|
||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
@ -221,12 +234,15 @@ impl From<MegolmV1AesSha2ContentInit> for MegolmV1AesSha2Content {
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: Remove on next breaking change release
|
||||
impl From<message::Relation> for Relation {
|
||||
fn from(rel: message::Relation) -> Self {
|
||||
match rel {
|
||||
message::Relation::Reply { in_reply_to } => Self::Reply { in_reply_to },
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
message::Relation::Replacement(re) => Self::Replacement(re),
|
||||
message::Relation::Replacement(re) => {
|
||||
Self::Replacement(Replacement { event_id: re.event_id })
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,12 +1,8 @@
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
use ruma_identifiers::EventId;
|
||||
use serde::{ser::SerializeStruct as _, Deserialize, Deserializer, Serialize, Serializer};
|
||||
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
use super::{Annotation, Reference, Replacement};
|
||||
use super::{InReplyTo, Relation};
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
use crate::room::message::MessageEventContent;
|
||||
|
||||
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<Relation>, D::Error>
|
||||
where
|
||||
@ -22,9 +18,8 @@ where
|
||||
let relation = match relation {
|
||||
RelationJsonRepr::Annotation(a) => Relation::Annotation(a),
|
||||
RelationJsonRepr::Reference(r) => Relation::Reference(r),
|
||||
RelationJsonRepr::Replacement(ReplacementJsonRepr { event_id }) => {
|
||||
let new_content = ev.new_content?;
|
||||
Relation::Replacement(Replacement { event_id, new_content })
|
||||
RelationJsonRepr::Replacement(Replacement { event_id }) => {
|
||||
Relation::Replacement(Replacement { event_id })
|
||||
}
|
||||
// FIXME: Maybe we should log this, though at this point we don't even have access
|
||||
// to the rel_type of the unknown relation.
|
||||
@ -64,17 +59,12 @@ where
|
||||
..Default::default()
|
||||
}),
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
Relation::Replacement(Replacement { event_id, new_content }) => {
|
||||
EventWithRelatesToJsonRepr {
|
||||
relates_to: RelatesToJsonRepr {
|
||||
relation: Some(RelationJsonRepr::Replacement(ReplacementJsonRepr {
|
||||
event_id: event_id.clone(),
|
||||
})),
|
||||
..Default::default()
|
||||
},
|
||||
new_content: Some(new_content.clone()),
|
||||
}
|
||||
}
|
||||
Relation::Replacement(r) => EventWithRelatesToJsonRepr {
|
||||
relates_to: RelatesToJsonRepr {
|
||||
relation: Some(RelationJsonRepr::Replacement(r.clone())),
|
||||
..Default::default()
|
||||
},
|
||||
},
|
||||
Relation::Reply { in_reply_to } => EventWithRelatesToJsonRepr::new(RelatesToJsonRepr {
|
||||
in_reply_to: Some(in_reply_to.clone()),
|
||||
..Default::default()
|
||||
@ -88,19 +78,11 @@ where
|
||||
struct EventWithRelatesToJsonRepr {
|
||||
#[serde(rename = "m.relates_to", default, skip_serializing_if = "RelatesToJsonRepr::is_empty")]
|
||||
relates_to: RelatesToJsonRepr,
|
||||
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
#[serde(rename = "m.new_content", skip_serializing_if = "Option::is_none")]
|
||||
new_content: Option<Box<MessageEventContent>>,
|
||||
}
|
||||
|
||||
impl EventWithRelatesToJsonRepr {
|
||||
fn new(relates_to: RelatesToJsonRepr) -> Self {
|
||||
Self {
|
||||
relates_to,
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
new_content: None,
|
||||
}
|
||||
Self { relates_to }
|
||||
}
|
||||
}
|
||||
|
||||
@ -145,7 +127,7 @@ enum RelationJsonRepr {
|
||||
|
||||
/// An event that replaces another event.
|
||||
#[serde(rename = "m.replace")]
|
||||
Replacement(ReplacementJsonRepr),
|
||||
Replacement(Replacement),
|
||||
|
||||
/// An unknown relation type.
|
||||
///
|
||||
@ -154,9 +136,3 @@ enum RelationJsonRepr {
|
||||
#[serde(other)]
|
||||
Unknown,
|
||||
}
|
||||
|
||||
#[derive(Clone, Deserialize, Serialize)]
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
struct ReplacementJsonRepr {
|
||||
event_id: EventId,
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user