common: Move prev_content into unsigned
This commit is contained in:
parent
1f53f38b4f
commit
ada3108a96
@ -188,13 +188,10 @@ pub mod video;
|
||||
|
||||
#[cfg(feature = "unstable-msc2675")]
|
||||
pub use self::relation::Relations;
|
||||
#[doc(hidden)]
|
||||
#[cfg(feature = "compat")]
|
||||
pub use self::unsigned::{RedactedUnsignedWithPrevContent, UnsignedWithPrevContent};
|
||||
pub use self::{
|
||||
enums::*,
|
||||
event_kinds::*,
|
||||
unsigned::{RedactedUnsigned, Unsigned},
|
||||
unsigned::{MessageLikeUnsigned, RedactedUnsigned, StateUnsigned},
|
||||
};
|
||||
|
||||
/// The base trait that all event content types implement.
|
||||
|
@ -5,8 +5,8 @@ use serde::{Deserialize, Serialize};
|
||||
|
||||
use super::{
|
||||
EphemeralRoomEventType, EventContent, GlobalAccountDataEventType, MessageLikeEventType,
|
||||
RedactedEventContent, RedactedUnsigned, RoomAccountDataEventType, StateEventType,
|
||||
ToDeviceEventType, Unsigned,
|
||||
MessageLikeUnsigned, RedactedEventContent, RedactedUnsigned, RoomAccountDataEventType,
|
||||
StateEventType, StateUnsigned, ToDeviceEventType,
|
||||
};
|
||||
use crate::{EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId};
|
||||
|
||||
@ -63,7 +63,7 @@ pub struct MessageLikeEvent<C: EventContent<EventType = MessageLikeEventType>> {
|
||||
pub room_id: Box<RoomId>,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
pub unsigned: Unsigned,
|
||||
pub unsigned: MessageLikeUnsigned,
|
||||
}
|
||||
|
||||
/// A message-like event without a `room_id`.
|
||||
@ -85,7 +85,7 @@ pub struct SyncMessageLikeEvent<C: EventContent<EventType = MessageLikeEventType
|
||||
pub origin_server_ts: MilliSecondsSinceUnixEpoch,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
pub unsigned: Unsigned,
|
||||
pub unsigned: MessageLikeUnsigned,
|
||||
}
|
||||
|
||||
/// A redacted message-like event.
|
||||
@ -166,11 +166,8 @@ pub struct StateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
/// affects.
|
||||
pub state_key: String,
|
||||
|
||||
/// Optional previous content for this event.
|
||||
pub prev_content: Option<C>,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
pub unsigned: Unsigned,
|
||||
pub unsigned: StateUnsigned<C>,
|
||||
}
|
||||
|
||||
/// A state event without a `room_id`.
|
||||
@ -197,11 +194,8 @@ pub struct SyncStateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
/// affects.
|
||||
pub state_key: String,
|
||||
|
||||
/// Optional previous content for this event.
|
||||
pub prev_content: Option<C>,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
pub unsigned: Unsigned,
|
||||
pub unsigned: StateUnsigned<C>,
|
||||
}
|
||||
|
||||
/// A stripped-down state event, used for previews of rooms the user has been invited to.
|
||||
|
@ -27,7 +27,7 @@ mod tests {
|
||||
event_id,
|
||||
events::{
|
||||
policy::rule::{PolicyRuleEventContent, Recommendation},
|
||||
Unsigned,
|
||||
StateUnsigned,
|
||||
},
|
||||
room_id,
|
||||
serde::Raw,
|
||||
@ -42,13 +42,7 @@ mod tests {
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(1_432_735_824_653_u64.try_into().unwrap()),
|
||||
room_id: room_id!("!jEsUZKDJdhlrceRyVU:example.org").to_owned(),
|
||||
state_key: "rule:#*:example.org".into(),
|
||||
prev_content: None,
|
||||
unsigned: Unsigned {
|
||||
age: Some(int!(1234)),
|
||||
transaction_id: None,
|
||||
#[cfg(feature = "unstable-msc2675")]
|
||||
relations: None,
|
||||
},
|
||||
unsigned: StateUnsigned { age: Some(int!(1234)), ..StateUnsigned::default() },
|
||||
content: PolicyRuleRoomEventContent(PolicyRuleEventContent {
|
||||
entity: "#*:example.org".into(),
|
||||
reason: "undesirable content".into(),
|
||||
|
@ -44,7 +44,7 @@ mod tests {
|
||||
use serde_json::{from_value as from_json_value, json, to_value as to_json_value};
|
||||
|
||||
use super::RoomCanonicalAliasEventContent;
|
||||
use crate::events::{StateEvent, Unsigned};
|
||||
use crate::events::{StateEvent, StateUnsigned};
|
||||
|
||||
#[test]
|
||||
fn serialization_with_optional_fields_as_none() {
|
||||
@ -55,11 +55,10 @@ mod tests {
|
||||
},
|
||||
event_id: event_id!("$h29iv0s8:example.com").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)),
|
||||
prev_content: None,
|
||||
room_id: room_id!("!dummy:example.com").to_owned(),
|
||||
sender: user_id!("@carl:example.com").to_owned(),
|
||||
state_key: "".into(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: StateUnsigned::default(),
|
||||
};
|
||||
|
||||
let actual = to_json_value(&canonical_alias_event).unwrap();
|
||||
|
@ -387,7 +387,12 @@ impl RoomMemberEvent {
|
||||
///
|
||||
/// [spec]: https://spec.matrix.org/v1.2/client-server-api/#mroommember
|
||||
pub fn membership_change(&self) -> MembershipChange {
|
||||
membership_change(&self.content, self.prev_content.as_ref(), &self.sender, &self.state_key)
|
||||
membership_change(
|
||||
&self.content,
|
||||
self.unsigned.prev_content.as_ref(),
|
||||
&self.sender,
|
||||
&self.state_key,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -398,7 +403,12 @@ impl SyncStateEvent<RoomMemberEventContent> {
|
||||
///
|
||||
/// [spec]: https://spec.matrix.org/v1.2/client-server-api/#mroommember
|
||||
pub fn membership_change(&self) -> MembershipChange {
|
||||
membership_change(&self.content, self.prev_content.as_ref(), &self.sender, &self.state_key)
|
||||
membership_change(
|
||||
&self.content,
|
||||
self.unsigned.prev_content.as_ref(),
|
||||
&self.sender,
|
||||
&self.state_key,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@ -422,7 +432,7 @@ mod tests {
|
||||
use serde_json::{from_value as from_json_value, json};
|
||||
|
||||
use super::{MembershipState, RoomMemberEventContent, SignedContent, ThirdPartyInvite};
|
||||
use crate::events::StateEvent;
|
||||
use crate::events::{StateEvent, StateUnsigned};
|
||||
|
||||
#[test]
|
||||
fn serde_with_no_prev_content() {
|
||||
@ -455,7 +465,6 @@ mod tests {
|
||||
sender,
|
||||
state_key,
|
||||
unsigned,
|
||||
prev_content: None,
|
||||
} if event_id == "$h29iv0s8:example.com"
|
||||
&& origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(1))
|
||||
&& room_id == "!n8f893n9:example.com"
|
||||
@ -474,12 +483,14 @@ mod tests {
|
||||
},
|
||||
"event_id": "$h29iv0s8:example.com",
|
||||
"origin_server_ts": 1,
|
||||
"room_id": "!n8f893n9:example.com",
|
||||
"sender": "@carl:example.com",
|
||||
"state_key": "example.com",
|
||||
"unsigned": {
|
||||
"prev_content": {
|
||||
"membership": "join"
|
||||
},
|
||||
"room_id": "!n8f893n9:example.com",
|
||||
"sender": "@carl:example.com",
|
||||
"state_key": "example.com"
|
||||
},
|
||||
});
|
||||
|
||||
assert_matches!(
|
||||
@ -498,7 +509,7 @@ mod tests {
|
||||
room_id,
|
||||
sender,
|
||||
state_key,
|
||||
unsigned,
|
||||
unsigned: StateUnsigned {
|
||||
prev_content: Some(RoomMemberEventContent {
|
||||
avatar_url: None,
|
||||
displayname: None,
|
||||
@ -507,12 +518,13 @@ mod tests {
|
||||
third_party_invite: None,
|
||||
..
|
||||
}),
|
||||
..
|
||||
},
|
||||
} if event_id == "$h29iv0s8:example.com"
|
||||
&& origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(1))
|
||||
&& room_id == "!n8f893n9:example.com"
|
||||
&& sender == "@carl:example.com"
|
||||
&& state_key == "example.com"
|
||||
&& unsigned.is_empty()
|
||||
);
|
||||
}
|
||||
|
||||
@ -565,7 +577,6 @@ mod tests {
|
||||
sender,
|
||||
state_key,
|
||||
unsigned,
|
||||
prev_content: None,
|
||||
} if avatar_url == "mxc://example.org/SEsfnsuifSDFSSEF"
|
||||
&& displayname == "Alice Margatroid"
|
||||
&& third_party_displayname == "alice"
|
||||
@ -590,10 +601,14 @@ mod tests {
|
||||
let json = json!({
|
||||
"type": "m.room.member",
|
||||
"content": {
|
||||
"membership": "join"
|
||||
"membership": "join",
|
||||
},
|
||||
"event_id": "$143273582443PhrSn:example.org",
|
||||
"origin_server_ts": 233,
|
||||
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
|
||||
"sender": "@alice:example.org",
|
||||
"state_key": "@alice:example.org",
|
||||
"unsigned": {
|
||||
"prev_content": {
|
||||
"avatar_url": "mxc://example.org/SEsfnsuifSDFSSEF",
|
||||
"displayname": "Alice Margatroid",
|
||||
@ -605,16 +620,14 @@ mod tests {
|
||||
"mxid": "@alice:example.org",
|
||||
"signatures": {
|
||||
"magic.forest": {
|
||||
"ed25519:3": "foobar"
|
||||
}
|
||||
"ed25519:3": "foobar",
|
||||
},
|
||||
},
|
||||
"token": "abc123"
|
||||
}
|
||||
}
|
||||
},
|
||||
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
|
||||
"sender": "@alice:example.org",
|
||||
"state_key": "@alice:example.org"
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
assert_matches!(
|
||||
@ -633,7 +646,7 @@ mod tests {
|
||||
room_id,
|
||||
sender,
|
||||
state_key,
|
||||
unsigned,
|
||||
unsigned: StateUnsigned {
|
||||
prev_content: Some(RoomMemberEventContent {
|
||||
avatar_url: Some(avatar_url),
|
||||
displayname: Some(displayname),
|
||||
@ -645,12 +658,13 @@ mod tests {
|
||||
}),
|
||||
..
|
||||
}),
|
||||
..
|
||||
},
|
||||
} if event_id == "$143273582443PhrSn:example.org"
|
||||
&& origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(233))
|
||||
&& room_id == "!jEsUZKDJdhlrceRyVU:example.org"
|
||||
&& sender == "@alice:example.org"
|
||||
&& state_key == "@alice:example.org"
|
||||
&& unsigned.is_empty()
|
||||
&& avatar_url == "mxc://example.org/SEsfnsuifSDFSSEF"
|
||||
&& displayname == "Alice Margatroid"
|
||||
&& third_party_displayname == "alice"
|
||||
@ -662,80 +676,6 @@ mod tests {
|
||||
}
|
||||
&& token == "abc123"
|
||||
);
|
||||
|
||||
#[cfg(feature = "compat")]
|
||||
assert_matches!(
|
||||
from_json_value::<StateEvent<RoomMemberEventContent>>(json!({
|
||||
"type": "m.room.member",
|
||||
"content": {
|
||||
"membership": "join"
|
||||
},
|
||||
"event_id": "$143273582443PhrSn:example.org",
|
||||
"origin_server_ts": 233,
|
||||
"prev_content": {
|
||||
"avatar_url": "",
|
||||
"displayname": "Alice Margatroid",
|
||||
"is_direct": true,
|
||||
"membership": "invite",
|
||||
"third_party_invite": {
|
||||
"display_name": "alice",
|
||||
"signed": {
|
||||
"mxid": "@alice:example.org",
|
||||
"signatures": {
|
||||
"magic.forest": {
|
||||
"ed25519:3": "foobar"
|
||||
}
|
||||
},
|
||||
"token": "abc123"
|
||||
}
|
||||
}
|
||||
},
|
||||
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
|
||||
"sender": "@alice:example.org",
|
||||
"state_key": "@alice:example.org"
|
||||
})).unwrap(),
|
||||
StateEvent {
|
||||
content: RoomMemberEventContent {
|
||||
avatar_url: None,
|
||||
displayname: None,
|
||||
is_direct: None,
|
||||
membership: MembershipState::Join,
|
||||
third_party_invite: None,
|
||||
..
|
||||
},
|
||||
event_id,
|
||||
origin_server_ts,
|
||||
room_id,
|
||||
sender,
|
||||
state_key,
|
||||
unsigned,
|
||||
prev_content: Some(RoomMemberEventContent {
|
||||
avatar_url: None,
|
||||
displayname: Some(displayname),
|
||||
is_direct: Some(true),
|
||||
membership: MembershipState::Invite,
|
||||
third_party_invite: Some(ThirdPartyInvite {
|
||||
display_name: third_party_displayname,
|
||||
signed: SignedContent { mxid, signatures, token },
|
||||
}),
|
||||
..
|
||||
}),
|
||||
} if event_id == "$143273582443PhrSn:example.org"
|
||||
&& origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(233))
|
||||
&& room_id == "!jEsUZKDJdhlrceRyVU:example.org"
|
||||
&& sender == "@alice:example.org"
|
||||
&& state_key == "@alice:example.org"
|
||||
&& unsigned.is_empty()
|
||||
&& displayname == "Alice Margatroid"
|
||||
&& third_party_displayname == "alice"
|
||||
&& mxid == "@alice:example.org"
|
||||
&& signatures == btreemap! {
|
||||
server_name!("magic.forest").to_owned() => btreemap! {
|
||||
server_signing_key_id!("ed25519:3").to_owned() => "foobar".to_owned()
|
||||
}
|
||||
}
|
||||
&& token == "abc123"
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
@ -771,7 +711,6 @@ mod tests {
|
||||
sender,
|
||||
state_key,
|
||||
unsigned,
|
||||
prev_content: None,
|
||||
} if event_id == "$h29iv0s8:example.com"
|
||||
&& origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(1))
|
||||
&& room_id == "!n8f893n9:example.com"
|
||||
|
@ -299,7 +299,9 @@ fn formatted_or_plain_body<'a>(formatted: &'a Option<FormattedBody>, body: &'a s
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::{event_id, room_id, user_id};
|
||||
use crate::{
|
||||
event_id, events::MessageLikeUnsigned, room_id, user_id, MilliSecondsSinceUnixEpoch,
|
||||
};
|
||||
|
||||
use super::{RoomMessageEvent, RoomMessageEventContent};
|
||||
|
||||
@ -310,9 +312,9 @@ mod tests {
|
||||
content: RoomMessageEventContent::text_plain("multi\nline"),
|
||||
event_id: event_id!("$1598361704261elfgc:localhost").to_owned(),
|
||||
sender: user_id!("@alice:example.com").to_owned(),
|
||||
origin_server_ts: crate::MilliSecondsSinceUnixEpoch::now(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch::now(),
|
||||
room_id: room_id!("!n8f893n9:example.com").to_owned(),
|
||||
unsigned: crate::events::Unsigned::new(),
|
||||
unsigned: MessageLikeUnsigned::new(),
|
||||
}),
|
||||
"> <@alice:example.com> multi\n> line"
|
||||
);
|
||||
|
@ -36,7 +36,7 @@ mod tests {
|
||||
use serde_json::{from_value as from_json_value, json, to_value as to_json_value};
|
||||
|
||||
use super::RoomNameEventContent;
|
||||
use crate::events::{StateEvent, Unsigned};
|
||||
use crate::events::{StateEvent, StateUnsigned};
|
||||
|
||||
#[test]
|
||||
fn serialization_with_optional_fields_as_none() {
|
||||
@ -44,11 +44,10 @@ mod tests {
|
||||
content: RoomNameEventContent { name: "The room name".try_into().ok() },
|
||||
event_id: event_id!("$h29iv0s8:example.com").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)),
|
||||
prev_content: None,
|
||||
room_id: room_id!("!n8f893n9:example.com").to_owned(),
|
||||
sender: user_id!("@carl:example.com").to_owned(),
|
||||
state_key: "".into(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: StateUnsigned::default(),
|
||||
};
|
||||
|
||||
let actual = to_json_value(&name_event).unwrap();
|
||||
@ -73,11 +72,14 @@ mod tests {
|
||||
content: RoomNameEventContent { name: "The room name".try_into().ok() },
|
||||
event_id: event_id!("$h29iv0s8:example.com").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)),
|
||||
prev_content: Some(RoomNameEventContent { name: "The old name".try_into().ok() }),
|
||||
room_id: room_id!("!n8f893n9:example.com").to_owned(),
|
||||
sender: user_id!("@carl:example.com").to_owned(),
|
||||
state_key: "".into(),
|
||||
unsigned: Unsigned { age: Some(int!(100)), ..Unsigned::default() },
|
||||
unsigned: StateUnsigned {
|
||||
age: Some(int!(100)),
|
||||
prev_content: Some(RoomNameEventContent { name: "The old name".try_into().ok() }),
|
||||
..StateUnsigned::default()
|
||||
},
|
||||
};
|
||||
|
||||
let actual = to_json_value(&name_event).unwrap();
|
||||
@ -87,13 +89,13 @@ mod tests {
|
||||
},
|
||||
"event_id": "$h29iv0s8:example.com",
|
||||
"origin_server_ts": 1,
|
||||
"prev_content": { "name": "The old name" },
|
||||
"room_id": "!n8f893n9:example.com",
|
||||
"sender": "@carl:example.com",
|
||||
"state_key": "",
|
||||
"type": "m.room.name",
|
||||
"unsigned": {
|
||||
"age": 100
|
||||
"age": 100,
|
||||
"prev_content": { "name": "The old name" },
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -32,7 +32,7 @@ mod tests {
|
||||
use crate::{server_name, EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId};
|
||||
|
||||
use super::RoomPinnedEventsEventContent;
|
||||
use crate::events::{StateEvent, Unsigned};
|
||||
use crate::events::{StateEvent, StateUnsigned};
|
||||
|
||||
#[test]
|
||||
fn serialization_deserialization() {
|
||||
@ -47,11 +47,10 @@ mod tests {
|
||||
content: content.clone(),
|
||||
event_id: EventId::new(server_name),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(1_432_804_485_886_u64.try_into().unwrap()),
|
||||
prev_content: None,
|
||||
room_id: RoomId::new(server_name),
|
||||
sender: UserId::new(server_name),
|
||||
state_key: "".into(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: StateUnsigned::default(),
|
||||
};
|
||||
|
||||
let serialized_event = serde_json::to_string(&event).unwrap();
|
||||
|
@ -182,7 +182,7 @@ mod tests {
|
||||
use serde_json::{json, to_value as to_json_value};
|
||||
|
||||
use super::{default_power_level, NotificationPowerLevels, RoomPowerLevelsEventContent};
|
||||
use crate::events::{StateEvent, Unsigned};
|
||||
use crate::events::{StateEvent, StateUnsigned};
|
||||
|
||||
#[test]
|
||||
fn serialization_with_optional_fields_as_none() {
|
||||
@ -203,9 +203,8 @@ mod tests {
|
||||
},
|
||||
event_id: event_id!("$h29iv0s8:example.com").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)),
|
||||
prev_content: None,
|
||||
room_id: room_id!("!n8f893n9:example.com").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: StateUnsigned::default(),
|
||||
sender: user_id!("@carl:example.com").to_owned(),
|
||||
state_key: "".into(),
|
||||
};
|
||||
@ -246,8 +245,12 @@ mod tests {
|
||||
},
|
||||
event_id: event_id!("$h29iv0s8:example.com").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)),
|
||||
room_id: room_id!("!n8f893n9:example.com").to_owned(),
|
||||
unsigned: StateUnsigned {
|
||||
age: Some(int!(100)),
|
||||
prev_content: Some(RoomPowerLevelsEventContent {
|
||||
// Make just one field different so we at least know they're two different objects.
|
||||
// Make just one field different so we at least know they're two different
|
||||
// objects.
|
||||
ban: int!(42),
|
||||
events: btreemap! {
|
||||
"m.dummy".into() => int!(42)
|
||||
@ -263,8 +266,8 @@ mod tests {
|
||||
users_default: int!(42),
|
||||
notifications: assign!(NotificationPowerLevels::new(), { room: int!(42) }),
|
||||
}),
|
||||
room_id: room_id!("!n8f893n9:example.com").to_owned(),
|
||||
unsigned: Unsigned { age: Some(int!(100)), ..Unsigned::default() },
|
||||
..StateUnsigned::default()
|
||||
},
|
||||
sender: user.to_owned(),
|
||||
state_key: "".into(),
|
||||
};
|
||||
@ -291,6 +294,12 @@ mod tests {
|
||||
},
|
||||
"event_id": "$h29iv0s8:example.com",
|
||||
"origin_server_ts": 1,
|
||||
"room_id": "!n8f893n9:example.com",
|
||||
"sender": "@carl:example.com",
|
||||
"state_key": "",
|
||||
"type": "m.room.power_levels",
|
||||
"unsigned": {
|
||||
"age": 100,
|
||||
"prev_content": {
|
||||
"ban": 42,
|
||||
"events": {
|
||||
@ -307,14 +316,8 @@ mod tests {
|
||||
"users_default": 42,
|
||||
"notifications": {
|
||||
"room": 42
|
||||
}
|
||||
},
|
||||
"room_id": "!n8f893n9:example.com",
|
||||
"sender": "@carl:example.com",
|
||||
"state_key": "",
|
||||
"type": "m.room.power_levels",
|
||||
"unsigned": {
|
||||
"age": 100
|
||||
},
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -6,7 +6,7 @@ use ruma_macros::{Event, EventContent};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{
|
||||
events::{Redact, RedactContent, RedactedUnsigned, Unsigned},
|
||||
events::{MessageLikeUnsigned, Redact, RedactContent, RedactedUnsigned},
|
||||
EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId,
|
||||
};
|
||||
|
||||
@ -33,7 +33,7 @@ pub struct RoomRedactionEvent {
|
||||
pub room_id: Box<RoomId>,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
pub unsigned: Unsigned,
|
||||
pub unsigned: MessageLikeUnsigned,
|
||||
}
|
||||
|
||||
impl Redact for RoomRedactionEvent {
|
||||
@ -103,7 +103,7 @@ pub struct SyncRoomRedactionEvent {
|
||||
pub origin_server_ts: MilliSecondsSinceUnixEpoch,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
pub unsigned: Unsigned,
|
||||
pub unsigned: MessageLikeUnsigned,
|
||||
}
|
||||
|
||||
impl Redact for SyncRoomRedactionEvent {
|
||||
|
@ -1,15 +1,16 @@
|
||||
use js_int::Int;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::{from_str as from_json_str, value::RawValue as RawJsonValue};
|
||||
|
||||
#[cfg(feature = "unstable-msc2675")]
|
||||
use super::relation::Relations;
|
||||
use super::room::redaction::SyncRoomRedactionEvent;
|
||||
use crate::TransactionId;
|
||||
use super::{room::redaction::SyncRoomRedactionEvent, EventContent, StateEventType};
|
||||
use crate::{serde::Raw, TransactionId};
|
||||
|
||||
/// Extra information about an event that is not incorporated into the event's hash.
|
||||
/// Extra information about a message event that is not incorporated into the event's hash.
|
||||
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
|
||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||
pub struct Unsigned {
|
||||
pub struct MessageLikeUnsigned {
|
||||
/// The time in milliseconds that has elapsed since the event was sent.
|
||||
///
|
||||
/// This field is generated by the local homeserver, and may be incorrect if the local time on
|
||||
@ -29,7 +30,7 @@ pub struct Unsigned {
|
||||
pub relations: Option<Relations>,
|
||||
}
|
||||
|
||||
impl Unsigned {
|
||||
impl MessageLikeUnsigned {
|
||||
/// Create a new `Unsigned` with fields set to `None`.
|
||||
pub fn new() -> Self {
|
||||
Self::default()
|
||||
@ -53,6 +54,118 @@ impl Unsigned {
|
||||
}
|
||||
}
|
||||
|
||||
/// Extra information about a state event that is not incorporated into the event's hash.
|
||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||
pub struct StateUnsigned<C: EventContent<EventType = StateEventType>> {
|
||||
/// The time in milliseconds that has elapsed since the event was sent.
|
||||
///
|
||||
/// This field is generated by the local homeserver, and may be incorrect if the local time on
|
||||
/// at least one of the two servers is out of sync, which can cause the age to either be
|
||||
/// negative or greater than it actually is.
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub age: Option<Int>,
|
||||
|
||||
/// The client-supplied transaction ID, if the client being given the event is the same one
|
||||
/// which sent it.
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub transaction_id: Option<Box<TransactionId>>,
|
||||
|
||||
/// Optional previous content of the event.
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub prev_content: Option<C>,
|
||||
|
||||
/// Server-compiled information from other events relating to this event.
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
#[serde(rename = "m.relations", skip_serializing_if = "Option::is_none")]
|
||||
pub relations: Option<Relations>,
|
||||
}
|
||||
|
||||
impl<C: EventContent<EventType = StateEventType>> StateUnsigned<C> {
|
||||
/// Create a new `Unsigned` with fields set to `None`.
|
||||
pub fn new() -> Self {
|
||||
Self {
|
||||
age: None,
|
||||
transaction_id: None,
|
||||
prev_content: None,
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
relations: None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Whether this unsigned data is empty (all fields are `None`).
|
||||
///
|
||||
/// This method is used to determine whether to skip serializing the `unsigned` field in room
|
||||
/// events. Do not use it to determine whether an incoming `unsigned` field was present - it
|
||||
/// could still have been present but contained none of the known fields.
|
||||
pub fn is_empty(&self) -> bool {
|
||||
#[cfg(not(feature = "unstable-msc2675"))]
|
||||
{
|
||||
self.age.is_none() && self.transaction_id.is_none() && self.prev_content.is_none()
|
||||
}
|
||||
|
||||
#[cfg(feature = "unstable-msc2675")]
|
||||
{
|
||||
self.age.is_none()
|
||||
&& self.transaction_id.is_none()
|
||||
&& self.prev_content.is_none()
|
||||
&& self.relations.is_none()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Helper functions for proc-macro code.
|
||||
///
|
||||
/// Needs to be public for UI tests.
|
||||
#[doc(hidden)]
|
||||
impl<C: EventContent<EventType = StateEventType>> StateUnsigned<C> {
|
||||
pub fn _from_parts(event_type: &str, object: &RawJsonValue) -> serde_json::Result<Self> {
|
||||
#[derive(Deserialize)]
|
||||
#[serde(bound = "")] // Disable default C: Deserialize bound
|
||||
struct WithRawPrevContent<C> {
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
age: Option<Int>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
transaction_id: Option<Box<TransactionId>>,
|
||||
prev_content: Option<Raw<C>>,
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
#[serde(rename = "m.relations", skip_serializing_if = "Option::is_none")]
|
||||
relations: Option<Relations>,
|
||||
}
|
||||
|
||||
let raw: WithRawPrevContent<C> = from_json_str(object.get())?;
|
||||
let prev_content =
|
||||
raw.prev_content.map(|r| r.deserialize_content(event_type.into())).transpose()?;
|
||||
|
||||
Ok(Self {
|
||||
age: raw.age,
|
||||
transaction_id: raw.transaction_id,
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
relations: raw.relations,
|
||||
prev_content,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn _map_prev_unsigned<T>(&self, f: impl FnOnce(&C) -> T) -> StateUnsigned<T>
|
||||
where
|
||||
T: EventContent<EventType = StateEventType>,
|
||||
{
|
||||
StateUnsigned {
|
||||
age: self.age,
|
||||
transaction_id: self.transaction_id.clone(),
|
||||
prev_content: self.prev_content.as_ref().map(f),
|
||||
#[cfg(feature = "unstable-pre-spec")]
|
||||
relations: self.relations.clone(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<C: EventContent<EventType = StateEventType>> Default for StateUnsigned<C> {
|
||||
fn default() -> Self {
|
||||
Self::new()
|
||||
}
|
||||
}
|
||||
|
||||
/// Extra information about a redacted event that is not incorporated into the event's hash.
|
||||
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
|
||||
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
|
||||
@ -82,49 +195,3 @@ impl RedactedUnsigned {
|
||||
self.redacted_because.is_none()
|
||||
}
|
||||
}
|
||||
|
||||
#[doc(hidden)]
|
||||
#[cfg(feature = "compat")]
|
||||
#[derive(Deserialize)]
|
||||
pub struct UnsignedWithPrevContent {
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
age: Option<Int>,
|
||||
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
transaction_id: Option<Box<TransactionId>>,
|
||||
|
||||
#[cfg(feature = "unstable-msc2675")]
|
||||
#[serde(rename = "m.relations", skip_serializing_if = "Option::is_none")]
|
||||
relations: Option<Relations>,
|
||||
|
||||
pub prev_content: Option<Box<serde_json::value::RawValue>>,
|
||||
}
|
||||
|
||||
#[cfg(feature = "compat")]
|
||||
impl From<UnsignedWithPrevContent> for Unsigned {
|
||||
fn from(u: UnsignedWithPrevContent) -> Self {
|
||||
Self {
|
||||
age: u.age,
|
||||
transaction_id: u.transaction_id,
|
||||
#[cfg(feature = "unstable-msc2675")]
|
||||
relations: u.relations,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[doc(hidden)]
|
||||
#[cfg(feature = "compat")]
|
||||
#[derive(Deserialize)]
|
||||
pub struct RedactedUnsignedWithPrevContent {
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
redacted_because: Option<Box<SyncRoomRedactionEvent>>,
|
||||
|
||||
pub prev_content: Option<Box<serde_json::value::RawValue>>,
|
||||
}
|
||||
|
||||
#[cfg(feature = "compat")]
|
||||
impl From<RedactedUnsignedWithPrevContent> for RedactedUnsigned {
|
||||
fn from(u: RedactedUnsignedWithPrevContent) -> Self {
|
||||
Self { redacted_because: u.redacted_because }
|
||||
}
|
||||
}
|
||||
|
@ -15,7 +15,7 @@ use ruma_common::{
|
||||
message::{InReplyTo, Relation},
|
||||
JsonWebKeyInit,
|
||||
},
|
||||
AnyMessageLikeEvent, MessageLikeEvent, Unsigned,
|
||||
AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned,
|
||||
},
|
||||
mxc_uri, room_id,
|
||||
serde::Base64,
|
||||
@ -170,7 +170,7 @@ fn event_serialization() {
|
||||
sender: user_id!("@user:notareal.hs").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(134_829_848)),
|
||||
room_id: room_id!("!roomid:notareal.hs").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
assert_eq!(
|
||||
|
@ -1,36 +0,0 @@
|
||||
#![cfg(feature = "compat")]
|
||||
|
||||
use matches::assert_matches;
|
||||
use ruma_common::events::room::topic::{RoomTopicEvent, RoomTopicEventContent};
|
||||
use serde_json::{from_value as from_json_value, json};
|
||||
|
||||
#[test]
|
||||
fn deserialize_unsigned_prev_content() {
|
||||
let res = from_json_value::<RoomTopicEvent>(json!({
|
||||
"content": {
|
||||
"topic": "New room topic",
|
||||
},
|
||||
"event_id": "$143273582443PhrSn:example.org",
|
||||
"origin_server_ts": 1_432_735_824_653_u64,
|
||||
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
|
||||
"sender": "@example:example.org",
|
||||
"state_key": "",
|
||||
"type": "m.room.topic",
|
||||
"unsigned": {
|
||||
"age": 1234,
|
||||
"prev_content": {
|
||||
"topic": "Old room topic",
|
||||
},
|
||||
},
|
||||
}));
|
||||
|
||||
assert_matches!(
|
||||
res,
|
||||
Ok(RoomTopicEvent {
|
||||
content: RoomTopicEventContent { topic: new_topic, .. },
|
||||
prev_content: Some(RoomTopicEventContent { topic: old_topic, .. }),
|
||||
..
|
||||
}) if new_topic == "New room topic"
|
||||
&& old_topic == "Old room topic"
|
||||
);
|
||||
}
|
@ -13,8 +13,8 @@ use ruma_common::{
|
||||
AnyEphemeralRoomEvent, AnyMessageLikeEvent, AnyRoomEvent, AnyStateEvent,
|
||||
AnyStateEventContent, AnySyncMessageLikeEvent, AnySyncRoomEvent, AnySyncStateEvent,
|
||||
EphemeralRoomEventType, GlobalAccountDataEventType, MessageLikeEvent, MessageLikeEventType,
|
||||
RoomAccountDataEventType, StateEvent, StateEventType, SyncMessageLikeEvent, SyncStateEvent,
|
||||
ToDeviceEventType, Unsigned,
|
||||
MessageLikeUnsigned, RoomAccountDataEventType, StateEvent, StateEventType,
|
||||
SyncMessageLikeEvent, SyncStateEvent, ToDeviceEventType,
|
||||
},
|
||||
MilliSecondsSinceUnixEpoch,
|
||||
};
|
||||
@ -208,7 +208,7 @@ fn message_event_serialization() {
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(0)),
|
||||
room_id: room_id!("!roomid:example.com").to_owned(),
|
||||
sender: user_id!("@test:example.com").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
assert_eq!(
|
||||
|
@ -12,7 +12,7 @@ use ruma_common::{
|
||||
message::{InReplyTo, Relation},
|
||||
JsonWebKeyInit,
|
||||
},
|
||||
AnyMessageLikeEvent, MessageLikeEvent, Unsigned,
|
||||
AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned,
|
||||
},
|
||||
mxc_uri, room_id,
|
||||
serde::Base64,
|
||||
@ -117,7 +117,7 @@ fn file_event_serialization() {
|
||||
sender: user_id!("@user:notareal.hs").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(134_829_848)),
|
||||
room_id: room_id!("!roomid:notareal.hs").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
assert_eq!(
|
||||
|
@ -16,7 +16,7 @@ use ruma_common::{
|
||||
message::{InReplyTo, Relation},
|
||||
JsonWebKeyInit,
|
||||
},
|
||||
AnyMessageLikeEvent, MessageLikeEvent, Unsigned,
|
||||
AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned,
|
||||
},
|
||||
mxc_uri, room_id,
|
||||
serde::Base64,
|
||||
@ -138,7 +138,7 @@ fn image_event_serialization() {
|
||||
sender: user_id!("@user:notareal.hs").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(134_829_848)),
|
||||
room_id: room_id!("!roomid:notareal.hs").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
assert_eq!(
|
||||
|
@ -12,7 +12,7 @@ use ruma_common::{
|
||||
},
|
||||
message::MessageContent,
|
||||
room::message::{InReplyTo, Relation},
|
||||
AnyMessageLikeEvent, MessageLikeEvent, Unsigned,
|
||||
AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned,
|
||||
},
|
||||
room_id, user_id, MilliSecondsSinceUnixEpoch,
|
||||
};
|
||||
@ -64,7 +64,7 @@ fn event_serialization() {
|
||||
sender: user_id!("@user:notareal.hs").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(134_829_848)),
|
||||
room_id: room_id!("!roomid:notareal.hs").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
assert_eq!(
|
||||
|
@ -10,7 +10,7 @@ use ruma_common::{
|
||||
message::MessageEventContent,
|
||||
notice::NoticeEventContent,
|
||||
room::message::{InReplyTo, Relation},
|
||||
AnyMessageLikeEvent, MessageLikeEvent, Unsigned,
|
||||
AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned,
|
||||
},
|
||||
room_id, user_id, MilliSecondsSinceUnixEpoch,
|
||||
};
|
||||
@ -114,7 +114,7 @@ fn message_event_serialization() {
|
||||
sender: user_id!("@user:notareal.hs").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(134_829_848)),
|
||||
room_id: room_id!("!roomid:notareal.hs").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
assert_eq!(
|
||||
@ -232,7 +232,7 @@ fn notice_event_serialization() {
|
||||
sender: user_id!("@user:notareal.hs").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(134_829_848)),
|
||||
room_id: room_id!("!roomid:notareal.hs").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
assert_eq!(
|
||||
@ -299,7 +299,7 @@ fn emote_event_serialization() {
|
||||
sender: user_id!("@user:notareal.hs").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(134_829_848)),
|
||||
room_id: room_id!("!roomid:notareal.hs").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
assert_eq!(
|
||||
|
@ -8,7 +8,7 @@ use ruma_common::{
|
||||
room::{ImageInfo, ThumbnailInfo},
|
||||
sticker::StickerEventContent,
|
||||
AnyMessageLikeEvent, AnyMessageLikeEventContent, AnySyncMessageLikeEvent, MessageLikeEvent,
|
||||
MessageLikeEventType, Unsigned,
|
||||
MessageLikeEventType, MessageLikeUnsigned,
|
||||
},
|
||||
mxc_uri, room_id,
|
||||
serde::Raw,
|
||||
@ -40,7 +40,7 @@ fn message_serialize_sticker() {
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)),
|
||||
room_id: room_id!("!roomid:room.com").to_owned(),
|
||||
sender: user_id!("@carl:example.com").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
let actual = to_json_value(&aliases_event).unwrap();
|
||||
|
@ -1,7 +1,6 @@
|
||||
#![cfg(feature = "events")]
|
||||
|
||||
mod audio;
|
||||
mod compat;
|
||||
mod enums;
|
||||
mod ephemeral_event;
|
||||
mod event;
|
||||
|
@ -10,9 +10,9 @@ use ruma_common::{
|
||||
redaction::{RoomRedactionEventContent, SyncRoomRedactionEvent},
|
||||
},
|
||||
AnyMessageLikeEvent, AnyRedactedMessageLikeEvent, AnyRedactedSyncMessageLikeEvent,
|
||||
AnyRedactedSyncStateEvent, AnyRoomEvent, AnySyncRoomEvent, EventContent, Redact,
|
||||
RedactContent, RedactedMessageLikeEvent, RedactedSyncMessageLikeEvent,
|
||||
RedactedSyncStateEvent, RedactedUnsigned, Unsigned,
|
||||
AnyRedactedSyncStateEvent, AnyRoomEvent, AnySyncRoomEvent, EventContent,
|
||||
MessageLikeUnsigned, Redact, RedactContent, RedactedMessageLikeEvent,
|
||||
RedactedSyncMessageLikeEvent, RedactedSyncStateEvent, RedactedUnsigned,
|
||||
},
|
||||
room_id, user_id, MilliSecondsSinceUnixEpoch, RoomVersionId,
|
||||
};
|
||||
@ -29,7 +29,7 @@ fn unsigned() -> RedactedUnsigned {
|
||||
event_id: event_id!("$h29iv0s8:example.com").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)),
|
||||
sender: user_id!("@carl:example.com").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
}));
|
||||
|
||||
unsigned
|
||||
@ -166,7 +166,7 @@ fn redacted_deserialize_any_room_sync() {
|
||||
event_id: event_id!("$h29iv0s8:example.com").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)),
|
||||
sender: user_id!("@carl:example.com").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
}));
|
||||
|
||||
let redacted = json!({
|
||||
@ -266,7 +266,7 @@ fn redact_method_properly_redacts() {
|
||||
event_id: event_id!("$h29iv0s8:example.com").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)),
|
||||
sender: user_id!("@carl:example.com").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
let event: AnyMessageLikeEvent = from_json_value(ev).unwrap();
|
||||
|
@ -4,7 +4,7 @@ use ruma_common::{
|
||||
event_id,
|
||||
events::{
|
||||
room::redaction::{RoomRedactionEvent, RoomRedactionEventContent},
|
||||
AnyMessageLikeEvent, Unsigned,
|
||||
AnyMessageLikeEvent, MessageLikeUnsigned,
|
||||
},
|
||||
room_id, user_id, MilliSecondsSinceUnixEpoch,
|
||||
};
|
||||
@ -35,7 +35,7 @@ fn serialize_redaction() {
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)),
|
||||
room_id: room_id!("!roomid:room.com").to_owned(),
|
||||
sender: user_id!("@carl:example.com").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
let actual = to_json_value(&aliases_event).unwrap();
|
||||
|
@ -11,7 +11,7 @@ use ruma_common::{
|
||||
AudioMessageEventContent, InReplyTo, KeyVerificationRequestEventContent, MessageType,
|
||||
Relation, RoomMessageEvent, RoomMessageEventContent, TextMessageEventContent,
|
||||
},
|
||||
Unsigned,
|
||||
MessageLikeUnsigned,
|
||||
},
|
||||
mxc_uri, room_id, user_id, DeviceId, MilliSecondsSinceUnixEpoch,
|
||||
};
|
||||
@ -41,7 +41,7 @@ fn serialization() {
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(10_000)),
|
||||
room_id: room_id!("!testroomid:example.org").to_owned(),
|
||||
sender: user_id!("@user:example.org").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
assert_eq!(
|
||||
|
@ -1,3 +1,4 @@
|
||||
use assign::assign;
|
||||
use js_int::{uint, UInt};
|
||||
use matches::assert_matches;
|
||||
use ruma_common::{
|
||||
@ -9,7 +10,7 @@ use ruma_common::{
|
||||
ThumbnailInfo,
|
||||
},
|
||||
AnyRoomEvent, AnyStateEvent, AnyStateEventContent, AnySyncStateEvent, StateEvent,
|
||||
StateEventType, SyncStateEvent, Unsigned,
|
||||
StateEventType, StateUnsigned, SyncStateEvent,
|
||||
},
|
||||
mxc_uri, room_alias_id, room_id,
|
||||
serde::Raw,
|
||||
@ -22,17 +23,19 @@ use serde_json::{
|
||||
fn aliases_event_with_prev_content() -> JsonValue {
|
||||
json!({
|
||||
"content": {
|
||||
"aliases": [ "#somewhere:localhost" ]
|
||||
"aliases": ["#somewhere:localhost"],
|
||||
},
|
||||
"event_id": "$h29iv0s8:example.com",
|
||||
"origin_server_ts": 1,
|
||||
"prev_content": {
|
||||
"aliases": [ "#inner:localhost" ]
|
||||
},
|
||||
"room_id": "!roomid:room.com",
|
||||
"sender": "@carl:example.com",
|
||||
"state_key": "",
|
||||
"type": "m.room.aliases"
|
||||
"type": "m.room.aliases",
|
||||
"unsigned": {
|
||||
"prev_content": {
|
||||
"aliases": ["#inner:localhost"],
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
@ -44,13 +47,15 @@ fn serialize_aliases_with_prev_content() {
|
||||
]),
|
||||
event_id: event_id!("$h29iv0s8:example.com").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)),
|
||||
prev_content: Some(RoomAliasesEventContent::new(vec![
|
||||
room_alias_id!("#inner:localhost").to_owned()
|
||||
])),
|
||||
room_id: room_id!("!roomid:room.com").to_owned(),
|
||||
sender: user_id!("@carl:example.com").to_owned(),
|
||||
state_key: "".into(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: assign!(StateUnsigned::default(), {
|
||||
prev_content: Some(RoomAliasesEventContent::new(vec![room_alias_id!(
|
||||
"#inner:localhost"
|
||||
)
|
||||
.to_owned()])),
|
||||
}),
|
||||
};
|
||||
|
||||
let actual = to_json_value(&aliases_event).unwrap();
|
||||
@ -67,11 +72,10 @@ fn serialize_aliases_without_prev_content() {
|
||||
]),
|
||||
event_id: event_id!("$h29iv0s8:example.com").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(1)),
|
||||
prev_content: None,
|
||||
room_id: room_id!("!roomid:room.com").to_owned(),
|
||||
sender: user_id!("@carl:example.com").to_owned(),
|
||||
state_key: "".into(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: StateUnsigned::default(),
|
||||
};
|
||||
|
||||
let actual = to_json_value(&aliases_event).unwrap();
|
||||
@ -116,11 +120,13 @@ fn deserialize_aliases_with_prev_content() {
|
||||
content,
|
||||
event_id,
|
||||
origin_server_ts,
|
||||
prev_content: Some(prev_content),
|
||||
room_id,
|
||||
sender,
|
||||
state_key,
|
||||
unsigned,
|
||||
unsigned: StateUnsigned {
|
||||
prev_content: Some(prev_content),
|
||||
..
|
||||
},
|
||||
}) if content.aliases == vec![room_alias_id!("#somewhere:localhost")]
|
||||
&& event_id == event_id!("$h29iv0s8:example.com")
|
||||
&& origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(1))
|
||||
@ -128,7 +134,6 @@ fn deserialize_aliases_with_prev_content() {
|
||||
&& room_id == room_id!("!roomid:room.com")
|
||||
&& sender == user_id!("@carl:example.com")
|
||||
&& state_key.is_empty()
|
||||
&& unsigned.is_empty()
|
||||
);
|
||||
}
|
||||
|
||||
@ -144,17 +149,18 @@ fn deserialize_aliases_sync_with_room_id() {
|
||||
content,
|
||||
event_id,
|
||||
origin_server_ts,
|
||||
prev_content: Some(prev_content),
|
||||
sender,
|
||||
state_key,
|
||||
unsigned,
|
||||
unsigned: StateUnsigned {
|
||||
prev_content: Some(prev_content),
|
||||
..
|
||||
},
|
||||
}) if content.aliases == vec![room_alias_id!("#somewhere:localhost")]
|
||||
&& event_id == event_id!("$h29iv0s8:example.com")
|
||||
&& origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(1))
|
||||
&& prev_content.aliases == vec![room_alias_id!("#inner:localhost")]
|
||||
&& sender == user_id!("@carl:example.com")
|
||||
&& state_key.is_empty()
|
||||
&& unsigned.is_empty()
|
||||
);
|
||||
}
|
||||
|
||||
@ -201,11 +207,10 @@ fn deserialize_avatar_without_prev_content() {
|
||||
},
|
||||
event_id,
|
||||
origin_server_ts,
|
||||
prev_content: None,
|
||||
room_id,
|
||||
sender,
|
||||
state_key,
|
||||
unsigned
|
||||
unsigned,
|
||||
}) if event_id == event_id!("$h29iv0s8:example.com")
|
||||
&& origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(1))
|
||||
&& room_id == room_id!("!roomid:room.com")
|
||||
@ -273,7 +278,6 @@ fn deserialize_member_event_with_top_level_membership_field() {
|
||||
content,
|
||||
event_id,
|
||||
origin_server_ts,
|
||||
prev_content: None,
|
||||
sender,
|
||||
..
|
||||
}
|
||||
@ -296,16 +300,17 @@ fn deserialize_full_event_convert_to_sync() {
|
||||
content,
|
||||
event_id,
|
||||
origin_server_ts,
|
||||
prev_content: Some(prev_content),
|
||||
sender,
|
||||
state_key,
|
||||
unsigned,
|
||||
unsigned: StateUnsigned {
|
||||
prev_content: Some(prev_content),
|
||||
..
|
||||
}
|
||||
}) if content.aliases == vec![room_alias_id!("#somewhere:localhost")]
|
||||
&& event_id == "$h29iv0s8:example.com"
|
||||
&& origin_server_ts == MilliSecondsSinceUnixEpoch(uint!(1))
|
||||
&& prev_content.aliases == vec![room_alias_id!("#inner:localhost")]
|
||||
&& sender == "@carl:example.com"
|
||||
&& state_key.is_empty()
|
||||
&& unsigned.is_empty()
|
||||
);
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
extern crate serde;
|
||||
|
||||
use ruma_common::{
|
||||
events::{EventContent, StateEventType, Unsigned},
|
||||
events::{EventContent, StateEventType, StateUnsigned},
|
||||
EventId, MilliSecondsSinceUnixEpoch, RoomId, UserId,
|
||||
};
|
||||
use ruma_macros::Event;
|
||||
@ -18,8 +18,7 @@ pub struct StateEvent<C: EventContent<EventType = StateEventType>> {
|
||||
pub origin_server_ts: MilliSecondsSinceUnixEpoch,
|
||||
pub room_id: Box<RoomId>,
|
||||
pub state_key: String,
|
||||
pub prev_content: Option<C>,
|
||||
pub unsigned: Unsigned,
|
||||
pub unsigned: StateUnsigned<C>,
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -18,7 +18,7 @@ use ruma_common::{
|
||||
JsonWebKeyInit,
|
||||
},
|
||||
video::{VideoContent, VideoEventContent},
|
||||
AnyMessageLikeEvent, MessageLikeEvent, Unsigned,
|
||||
AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned,
|
||||
},
|
||||
mxc_uri, room_id,
|
||||
serde::Base64,
|
||||
@ -147,7 +147,7 @@ fn event_serialization() {
|
||||
sender: user_id!("@user:notareal.hs").to_owned(),
|
||||
origin_server_ts: MilliSecondsSinceUnixEpoch(uint!(134_829_848)),
|
||||
room_id: room_id!("!roomid:notareal.hs").to_owned(),
|
||||
unsigned: Unsigned::default(),
|
||||
unsigned: MessageLikeUnsigned::default(),
|
||||
};
|
||||
|
||||
assert_eq!(
|
||||
|
@ -9,7 +9,7 @@ use syn::{
|
||||
|
||||
use super::{
|
||||
event_parse::{to_kind_variation, EventKind, EventKindVariation},
|
||||
util::is_non_stripped_room_event,
|
||||
util::{has_prev_content, is_non_stripped_room_event},
|
||||
};
|
||||
use crate::{import_ruma_common, util::to_camel_case};
|
||||
|
||||
@ -135,7 +135,7 @@ fn expand_serialize_event(
|
||||
|
||||
fn expand_deserialize_event(
|
||||
input: &DeriveInput,
|
||||
_kind: EventKind,
|
||||
kind: EventKind,
|
||||
var: EventKindVariation,
|
||||
fields: &[Field],
|
||||
ruma_common: &TokenStream,
|
||||
@ -168,32 +168,14 @@ fn expand_deserialize_event(
|
||||
.map(|field| {
|
||||
let name = field.ident.as_ref().unwrap();
|
||||
let ty = &field.ty;
|
||||
if name == "content" || name == "prev_content" {
|
||||
if name == "content" || (name == "unsigned" && has_prev_content(kind, var)) {
|
||||
if is_generic {
|
||||
quote! { ::std::boxed::Box<#serde_json::value::RawValue> }
|
||||
} else {
|
||||
quote! { #content_type }
|
||||
}
|
||||
} else {
|
||||
#[allow(unused_mut)]
|
||||
let mut ty = quote! { #ty };
|
||||
|
||||
#[cfg(feature = "compat")]
|
||||
if matches!(_kind, EventKind::State) && name == "unsigned" {
|
||||
match var {
|
||||
EventKindVariation::Full | EventKindVariation::Sync => {
|
||||
ty = quote! { #ruma_common::events::UnsignedWithPrevContent };
|
||||
}
|
||||
EventKindVariation::Redacted | EventKindVariation::RedactedSync => {
|
||||
ty = quote! { #ruma_common::events::RedactedUnsignedWithPrevContent };
|
||||
}
|
||||
EventKindVariation::Stripped | EventKindVariation::Initial => {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ty
|
||||
quote! { #ty }
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
@ -239,45 +221,13 @@ fn expand_deserialize_event(
|
||||
)?;
|
||||
}
|
||||
}
|
||||
} else if name == "prev_content" {
|
||||
if is_generic {
|
||||
#[allow(unused_mut)]
|
||||
let mut res = quote! {
|
||||
let prev_content = prev_content.map(|json| {
|
||||
C::from_parts(&event_type, &json).map_err(A::Error::custom)
|
||||
}).transpose()?;
|
||||
};
|
||||
|
||||
#[cfg(feature = "compat")]
|
||||
if let EventKind::State = _kind {
|
||||
res = quote! {
|
||||
let prev_content = prev_content
|
||||
.or_else(|| unsigned.as_mut().and_then(|u| u.prev_content.take()));
|
||||
#res
|
||||
};
|
||||
};
|
||||
|
||||
res
|
||||
} else {
|
||||
TokenStream::new()
|
||||
} else if name == "unsigned" && has_prev_content(kind, var) {
|
||||
quote! {
|
||||
let unsigned = unsigned.map(|json| {
|
||||
#ruma_common::events::StateUnsigned::_from_parts(&event_type, &json)
|
||||
.map_err(A::Error::custom)
|
||||
}).transpose()?.unwrap_or_default();
|
||||
}
|
||||
} else if name == "unsigned" {
|
||||
#[allow(unused_mut)]
|
||||
let mut res = quote! {
|
||||
let unsigned = unsigned.unwrap_or_default();
|
||||
};
|
||||
|
||||
#[cfg(feature = "compat")]
|
||||
if matches!(_kind, EventKind::State) {
|
||||
res = quote! {
|
||||
let unsigned = unsigned.map_or_else(
|
||||
::std::default::Default::default,
|
||||
::std::convert::From::from,
|
||||
);
|
||||
};
|
||||
}
|
||||
|
||||
res
|
||||
} else {
|
||||
let attrs: Vec<_> = field
|
||||
.attrs
|
||||
@ -296,7 +246,7 @@ fn expand_deserialize_event(
|
||||
)
|
||||
});
|
||||
|
||||
if has_default_attr {
|
||||
if has_default_attr || name == "unsigned" {
|
||||
quote! {
|
||||
let #name = #name.unwrap_or_default();
|
||||
}
|
||||
|
@ -6,7 +6,7 @@ use syn::{Attribute, Data, DataEnum, DeriveInput, Ident, LitStr};
|
||||
|
||||
use super::{
|
||||
event_parse::{EventEnumDecl, EventEnumEntry, EventKind, EventKindVariation},
|
||||
util::{has_prev_content_field, EVENT_FIELDS},
|
||||
util::{has_prev_content, is_non_stripped_room_event, EVENT_FIELDS},
|
||||
};
|
||||
use crate::util::m_prefix_name_to_type_name;
|
||||
|
||||
@ -418,18 +418,20 @@ fn expand_accessor_methods(
|
||||
let content_enum = kind.to_content_enum();
|
||||
let content_variants: Vec<_> = variants.iter().map(|v| v.ctor(&content_enum)).collect();
|
||||
|
||||
let prev_content = has_prev_content_field(kind, var).then(|| {
|
||||
let unsigned = if has_prev_content(kind, var) {
|
||||
quote! {
|
||||
/// Returns the previous content for this event.
|
||||
pub fn prev_content(&self) -> Option<#content_enum> {
|
||||
/// Returns this event's unsigned field.
|
||||
pub fn unsigned(&self) -> #ruma_common::events::StateUnsigned<#content_enum> {
|
||||
match self {
|
||||
#(
|
||||
#self_variants(event) => {
|
||||
event.prev_content.as_ref().map(|c| #content_variants(c.clone()))
|
||||
event.unsigned._map_prev_unsigned(|c| {
|
||||
#content_variants(c.clone())
|
||||
})
|
||||
},
|
||||
)*
|
||||
Self::_Custom(event) => {
|
||||
event.prev_content.as_ref().map(|c| #content_enum::_Custom {
|
||||
event.unsigned._map_prev_unsigned(|c| #content_enum::_Custom {
|
||||
event_type: crate::PrivOwnedStr(
|
||||
::std::convert::From::from(
|
||||
#ruma_common::events::EventContent::event_type(c).as_str()
|
||||
@ -440,7 +442,22 @@ fn expand_accessor_methods(
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
} else if is_non_stripped_room_event(kind, var) {
|
||||
let field_type = field_return_type("unsigned", var, ruma_common);
|
||||
let variants = variants.iter().map(|v| v.match_arm(quote! { Self }));
|
||||
|
||||
quote! {
|
||||
/// Returns this event's unsigned field.
|
||||
pub fn unsigned(&self) -> &#field_type {
|
||||
match self {
|
||||
#( #variants(event) => &event.unsigned, )*
|
||||
Self::_Custom(event) => &event.unsigned,
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
quote! {}
|
||||
};
|
||||
|
||||
quote! {
|
||||
/// Returns the content for this event.
|
||||
@ -458,7 +475,7 @@ fn expand_accessor_methods(
|
||||
}
|
||||
}
|
||||
|
||||
#prev_content
|
||||
#unsigned
|
||||
}
|
||||
});
|
||||
|
||||
@ -558,7 +575,7 @@ fn field_return_type(
|
||||
if var.is_redacted() {
|
||||
quote! { #ruma_common::events::RedactedUnsigned }
|
||||
} else {
|
||||
quote! { #ruma_common::events::Unsigned }
|
||||
quote! { #ruma_common::events::MessageLikeUnsigned }
|
||||
}
|
||||
}
|
||||
_ => panic!("the `ruma_macros::event_enum::EVENT_FIELD` const was changed"),
|
||||
|
@ -11,7 +11,7 @@ pub(crate) fn is_non_stripped_room_event(kind: EventKind, var: EventKindVariatio
|
||||
)
|
||||
}
|
||||
|
||||
pub(crate) fn has_prev_content_field(kind: EventKind, var: EventKindVariation) -> bool {
|
||||
pub(crate) fn has_prev_content(kind: EventKind, var: EventKindVariation) -> bool {
|
||||
matches!(kind, EventKind::State)
|
||||
&& matches!(var, EventKindVariation::Full | EventKindVariation::Sync)
|
||||
}
|
||||
@ -34,5 +34,4 @@ pub(crate) const EVENT_FIELDS: &[(&str, EventKindFn)] = &[
|
||||
&& var != EventKindVariation::Initial
|
||||
}),
|
||||
("state_key", |kind, _| matches!(kind, EventKind::State)),
|
||||
("unsigned", is_non_stripped_room_event),
|
||||
];
|
||||
|
Loading…
x
Reference in New Issue
Block a user