common: Deserialize stable names for unstable features
This commit is contained in:
parent
5c2c13145d
commit
0fb3f39c07
@ -135,7 +135,7 @@ pub struct Relations {
|
||||
|
||||
/// Thread relation.
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
#[serde(rename = "io.element.thread")]
|
||||
#[serde(rename = "io.element.thread", alias = "m.thread")]
|
||||
pub thread: Option<BundledThread>,
|
||||
}
|
||||
|
||||
|
@ -73,7 +73,11 @@ pub struct ImageInfo {
|
||||
/// This uses the unstable prefix in
|
||||
/// [MSC2448](https://github.com/matrix-org/matrix-spec-proposals/pull/2448).
|
||||
#[cfg(feature = "unstable-msc2448")]
|
||||
#[serde(rename = "xyz.amorgan.blurhash", skip_serializing_if = "Option::is_none")]
|
||||
#[serde(
|
||||
rename = "xyz.amorgan.blurhash",
|
||||
alias = "blurhash",
|
||||
skip_serializing_if = "Option::is_none"
|
||||
)]
|
||||
pub blurhash: Option<String>,
|
||||
}
|
||||
|
||||
|
@ -91,7 +91,11 @@ pub struct ImageInfo {
|
||||
/// This uses the unstable prefix in
|
||||
/// [MSC2448](https://github.com/matrix-org/matrix-spec-proposals/pull/2448).
|
||||
#[cfg(feature = "unstable-msc2448")]
|
||||
#[serde(rename = "xyz.amorgan.blurhash", skip_serializing_if = "Option::is_none")]
|
||||
#[serde(
|
||||
rename = "xyz.amorgan.blurhash",
|
||||
alias = "blurhash",
|
||||
skip_serializing_if = "Option::is_none"
|
||||
)]
|
||||
pub blurhash: Option<String>,
|
||||
}
|
||||
|
||||
|
@ -18,8 +18,10 @@ impl<'de> Deserialize<'de> for Relation {
|
||||
let ev = EventWithRelatesToJsonRepr::deserialize(deserializer)?;
|
||||
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
if let Some(RelationJsonRepr::Thread(ThreadJsonRepr { event_id, is_falling_back })) =
|
||||
ev.relates_to.relation
|
||||
if let Some(
|
||||
RelationJsonRepr::ThreadStable(ThreadStableJsonRepr { event_id, is_falling_back })
|
||||
| RelationJsonRepr::ThreadUnstable(ThreadUnstableJsonRepr { event_id, is_falling_back }),
|
||||
) = ev.relates_to.relation
|
||||
{
|
||||
let in_reply_to = ev
|
||||
.relates_to
|
||||
@ -27,7 +29,6 @@ impl<'de> Deserialize<'de> for Relation {
|
||||
.ok_or_else(|| serde::de::Error::missing_field("m.in_reply_to"))?;
|
||||
return Ok(Relation::Thread(Thread { event_id, in_reply_to, is_falling_back }));
|
||||
}
|
||||
|
||||
let rel = if let Some(in_reply_to) = ev.relates_to.in_reply_to {
|
||||
Relation::Reply { in_reply_to }
|
||||
} else if let Some(relation) = ev.relates_to.relation {
|
||||
@ -40,7 +41,9 @@ impl<'de> Deserialize<'de> for Relation {
|
||||
Relation::Replacement(Replacement { event_id })
|
||||
}
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
RelationJsonRepr::Thread(_) => unreachable!(),
|
||||
RelationJsonRepr::ThreadStable(_) | RelationJsonRepr::ThreadUnstable(_) => {
|
||||
unreachable!()
|
||||
}
|
||||
// FIXME: Maybe we should log this, though at this point we don't even have
|
||||
// access to the rel_type of the unknown relation.
|
||||
RelationJsonRepr::Unknown => Relation::_Custom,
|
||||
@ -81,7 +84,7 @@ impl Serialize for Relation {
|
||||
Relation::Thread(Thread { event_id, in_reply_to, is_falling_back }) => {
|
||||
RelatesToJsonRepr {
|
||||
in_reply_to: Some(in_reply_to.clone()),
|
||||
relation: Some(RelationJsonRepr::Thread(ThreadJsonRepr {
|
||||
relation: Some(RelationJsonRepr::ThreadUnstable(ThreadUnstableJsonRepr {
|
||||
event_id: event_id.clone(),
|
||||
is_falling_back: *is_falling_back,
|
||||
})),
|
||||
@ -118,10 +121,23 @@ impl RelatesToJsonRepr {
|
||||
}
|
||||
}
|
||||
|
||||
/// A thread relation without the reply fallback.
|
||||
/// A thread relation without the reply fallback, with stable names.
|
||||
#[derive(Clone, Deserialize, Serialize)]
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
struct ThreadJsonRepr {
|
||||
struct ThreadStableJsonRepr {
|
||||
/// The ID of the root message in the thread.
|
||||
pub event_id: Box<EventId>,
|
||||
|
||||
/// Whether the `m.in_reply_to` field is a fallback for older clients or a real reply in a
|
||||
/// thread.
|
||||
#[serde(default, skip_serializing_if = "ruma_common::serde::is_default")]
|
||||
pub is_falling_back: bool,
|
||||
}
|
||||
|
||||
/// A thread relation without the reply fallback, with unstable names.
|
||||
#[derive(Clone, Deserialize, Serialize)]
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
struct ThreadUnstableJsonRepr {
|
||||
/// The ID of the root message in the thread.
|
||||
pub event_id: Box<EventId>,
|
||||
|
||||
@ -153,10 +169,15 @@ enum RelationJsonRepr {
|
||||
#[serde(rename = "m.replace")]
|
||||
Replacement(Replacement),
|
||||
|
||||
/// An event that belongs to a thread.
|
||||
/// An event that belongs to a thread, with stable names.
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
#[serde(rename = "m.thread")]
|
||||
ThreadStable(ThreadStableJsonRepr),
|
||||
|
||||
/// An event that belongs to a thread, with unstable names.
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
#[serde(rename = "io.element.thread")]
|
||||
Thread(ThreadJsonRepr),
|
||||
ThreadUnstable(ThreadUnstableJsonRepr),
|
||||
|
||||
/// An unknown relation type.
|
||||
///
|
||||
|
@ -76,7 +76,11 @@ pub struct RoomMemberEventContent {
|
||||
/// This uses the unstable prefix in
|
||||
/// [MSC2448](https://github.com/matrix-org/matrix-spec-proposals/pull/2448).
|
||||
#[cfg(feature = "unstable-msc2448")]
|
||||
#[serde(rename = "xyz.amorgan.blurhash", skip_serializing_if = "Option::is_none")]
|
||||
#[serde(
|
||||
rename = "xyz.amorgan.blurhash",
|
||||
alias = "blurhash",
|
||||
skip_serializing_if = "Option::is_none"
|
||||
)]
|
||||
pub blurhash: Option<String>,
|
||||
|
||||
/// User-supplied text for why their membership has changed.
|
||||
|
@ -18,8 +18,10 @@ impl<'de> Deserialize<'de> for Relation {
|
||||
let ev = EventWithRelatesToJsonRepr::deserialize(deserializer)?;
|
||||
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
if let Some(RelationJsonRepr::Thread(ThreadJsonRepr { event_id, is_falling_back })) =
|
||||
ev.relates_to.relation
|
||||
if let Some(
|
||||
RelationJsonRepr::ThreadStable(ThreadStableJsonRepr { event_id, is_falling_back })
|
||||
| RelationJsonRepr::ThreadUnstable(ThreadUnstableJsonRepr { event_id, is_falling_back }),
|
||||
) = ev.relates_to.relation
|
||||
{
|
||||
let in_reply_to = ev
|
||||
.relates_to
|
||||
@ -43,7 +45,9 @@ impl<'de> Deserialize<'de> for Relation {
|
||||
// access to the rel_type of the unknown relation.
|
||||
RelationJsonRepr::Unknown => Relation::_Custom,
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
RelationJsonRepr::Thread(_) => unreachable!(),
|
||||
RelationJsonRepr::ThreadStable(_) | RelationJsonRepr::ThreadUnstable(_) => {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Relation::_Custom
|
||||
@ -80,7 +84,7 @@ impl Serialize for Relation {
|
||||
Relation::Thread(Thread { event_id, in_reply_to, is_falling_back }) => {
|
||||
EventWithRelatesToJsonRepr::new(RelatesToJsonRepr {
|
||||
in_reply_to: Some(in_reply_to.clone()),
|
||||
relation: Some(RelationJsonRepr::Thread(ThreadJsonRepr {
|
||||
relation: Some(RelationJsonRepr::ThreadUnstable(ThreadUnstableJsonRepr {
|
||||
event_id: event_id.clone(),
|
||||
is_falling_back: *is_falling_back,
|
||||
})),
|
||||
@ -140,10 +144,15 @@ enum RelationJsonRepr {
|
||||
#[serde(rename = "m.replace")]
|
||||
Replacement(ReplacementJsonRepr),
|
||||
|
||||
/// An event that belongs to a thread.
|
||||
/// An event that belongs to a thread, with unstable names.
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
#[serde(rename = "m.thread")]
|
||||
ThreadStable(ThreadStableJsonRepr),
|
||||
|
||||
/// An event that belongs to a thread, with unstable names.
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
#[serde(rename = "io.element.thread")]
|
||||
Thread(ThreadJsonRepr),
|
||||
ThreadUnstable(ThreadUnstableJsonRepr),
|
||||
|
||||
/// An unknown relation type.
|
||||
///
|
||||
@ -159,10 +168,23 @@ struct ReplacementJsonRepr {
|
||||
event_id: Box<EventId>,
|
||||
}
|
||||
|
||||
/// A thread relation without the reply fallback.
|
||||
/// A thread relation without the reply fallback, with stable names.
|
||||
#[derive(Clone, Deserialize, Serialize)]
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
struct ThreadJsonRepr {
|
||||
struct ThreadStableJsonRepr {
|
||||
/// The ID of the root message in the thread.
|
||||
event_id: Box<EventId>,
|
||||
|
||||
/// Whether the `m.in_reply_to` field is a fallback for older clients or a real reply in a
|
||||
/// thread.
|
||||
#[serde(default, skip_serializing_if = "ruma_common::serde::is_default")]
|
||||
is_falling_back: bool,
|
||||
}
|
||||
|
||||
/// A thread relation without the reply fallback, with unstable names.
|
||||
#[derive(Clone, Deserialize, Serialize)]
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
struct ThreadUnstableJsonRepr {
|
||||
/// The ID of the root message in the thread.
|
||||
event_id: Box<EventId>,
|
||||
|
||||
|
@ -255,7 +255,43 @@ fn thread_reply_serialize() {
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
fn thread_deserialize() {
|
||||
fn thread_stable_deserialize() {
|
||||
use ruma_common::events::room::message::Thread;
|
||||
|
||||
let json = json!({
|
||||
"msgtype": "m.text",
|
||||
"body": "<text msg>",
|
||||
"m.relates_to": {
|
||||
"rel_type": "m.thread",
|
||||
"event_id": "$1598361704261elfgc",
|
||||
"m.in_reply_to": {
|
||||
"event_id": "$latesteventid",
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
assert_matches!(
|
||||
from_json_value::<RoomMessageEventContent>(json).unwrap(),
|
||||
RoomMessageEventContent {
|
||||
msgtype: MessageType::Text(_),
|
||||
relates_to: Some(Relation::Thread(
|
||||
Thread {
|
||||
event_id,
|
||||
in_reply_to: InReplyTo { event_id: reply_to_event_id, .. },
|
||||
is_falling_back,
|
||||
..
|
||||
},
|
||||
)),
|
||||
..
|
||||
} if event_id == "$1598361704261elfgc"
|
||||
&& reply_to_event_id == "$latesteventid"
|
||||
&& !is_falling_back
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[cfg(feature = "unstable-msc3440")]
|
||||
fn thread_unstable_deserialize() {
|
||||
use ruma_common::events::room::message::Thread;
|
||||
|
||||
let json = json!({
|
||||
|
Loading…
x
Reference in New Issue
Block a user