Optimize formatted event serializations.

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2025-11-29 02:01:30 +00:00
parent e84d6666c0
commit c9362b8605
3 changed files with 125 additions and 143 deletions

View File

@@ -1,4 +1,5 @@
use ruma::{
CanonicalJsonMemberOptional as JsonMember, CanonicalJsonMembersOptional as JsonMembers,
events::{
AnyMessageLikeEvent, AnyStateEvent, AnyStrippedStateEvent, AnySyncMessageLikeEvent,
AnySyncStateEvent, AnySyncTimelineEvent, AnyTimelineEvent, StateEvent,
@@ -6,7 +7,7 @@ use ruma::{
},
serde::Raw,
};
use serde_json::json;
use serde_json::value::to_raw_value;
use super::{Event, redact};
@@ -22,25 +23,20 @@ impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncTimelineEvent> {
fn from(event: Ref<'a, E>) -> Self {
let event = event.0;
let (redacts, content) = redact::copy(event);
let mut json = json!({
"content": content,
"event_id": event.event_id(),
"origin_server_ts": event.origin_server_ts(),
"sender": event.sender(),
"type": event.event_type(),
});
let members: [JsonMember<_>; _] = [
("content", Some(content.into())),
("event_id", Some(event.event_id().as_str().into())),
("origin_server_ts", Some(event.origin_server_ts().get().into())),
("redacts", redacts.map(|e| e.as_str().into())),
("sender", Some(event.sender().as_str().into())),
("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
("unsigned", event.unsigned().map(Into::into)),
];
if let Some(redacts) = redacts {
json["redacts"] = json!(redacts);
}
if let Some(state_key) = event.state_key() {
json["state_key"] = json!(state_key);
}
if let Some(unsigned) = event.unsigned() {
json["unsigned"] = json!(unsigned);
}
serde_json::from_value(json).expect("Failed to serialize Event value")
to_raw_value(&JsonMembers(&members))
.map(Self::from_json)
.expect("Failed to serialize Event value")
}
}
@@ -52,26 +48,21 @@ impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyTimelineEvent> {
fn from(event: Ref<'a, E>) -> Self {
let event = event.0;
let (redacts, content) = redact::copy(event);
let mut json = json!({
"content": content,
"event_id": event.event_id(),
"origin_server_ts": event.origin_server_ts(),
"room_id": event.room_id(),
"sender": event.sender(),
"type": event.kind(),
});
let members: [JsonMember<_>; _] = [
("content", Some(content.into())),
("event_id", Some(event.event_id().as_str().into())),
("origin_server_ts", Some(event.origin_server_ts().get().into())),
("redacts", redacts.map(|e| e.as_str().into())),
("room_id", Some(event.room_id().as_str().into())),
("sender", Some(event.sender().as_str().into())),
("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
("unsigned", event.unsigned().map(Into::into)),
];
if let Some(redacts) = redacts {
json["redacts"] = json!(redacts);
}
if let Some(state_key) = event.state_key() {
json["state_key"] = json!(state_key);
}
if let Some(unsigned) = event.unsigned() {
json["unsigned"] = json!(unsigned);
}
serde_json::from_value(json).expect("Failed to serialize Event value")
to_raw_value(&JsonMembers(&members))
.map(Self::from_json)
.expect("Failed to serialize Event value")
}
}
@@ -83,26 +74,21 @@ impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyMessageLikeEvent> {
fn from(event: Ref<'a, E>) -> Self {
let event = event.0;
let (redacts, content) = redact::copy(event);
let mut json = json!({
"content": content,
"event_id": event.event_id(),
"origin_server_ts": event.origin_server_ts(),
"room_id": event.room_id(),
"sender": event.sender(),
"type": event.kind(),
});
let members: [JsonMember<_>; _] = [
("content", Some(content.into())),
("event_id", Some(event.event_id().as_str().into())),
("origin_server_ts", Some(event.origin_server_ts().get().into())),
("redacts", redacts.map(|e| e.as_str().into())),
("room_id", Some(event.room_id().as_str().into())),
("sender", Some(event.sender().as_str().into())),
("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
("unsigned", event.unsigned().map(Into::into)),
];
if let Some(redacts) = &redacts {
json["redacts"] = json!(redacts);
}
if let Some(state_key) = event.state_key() {
json["state_key"] = json!(state_key);
}
if let Some(unsigned) = event.unsigned() {
json["unsigned"] = json!(unsigned);
}
serde_json::from_value(json).expect("Failed to serialize Event value")
to_raw_value(&JsonMembers(&members))
.map(Self::from_json)
.expect("Failed to serialize Event value")
}
}
@@ -114,25 +100,20 @@ impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncMessageLikeEvent> {
fn from(event: Ref<'a, E>) -> Self {
let event = event.0;
let (redacts, content) = redact::copy(event);
let mut json = json!({
"content": content,
"event_id": event.event_id(),
"origin_server_ts": event.origin_server_ts(),
"sender": event.sender(),
"type": event.kind(),
});
let members: [JsonMember<_>; _] = [
("content", Some(content.into())),
("event_id", Some(event.event_id().as_str().into())),
("origin_server_ts", Some(event.origin_server_ts().get().into())),
("redacts", redacts.map(|e| e.as_str().into())),
("sender", Some(event.sender().as_str().into())),
("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
("unsigned", event.unsigned().map(Into::into)),
];
if let Some(redacts) = &redacts {
json["redacts"] = json!(redacts);
}
if let Some(state_key) = event.state_key() {
json["state_key"] = json!(state_key);
}
if let Some(unsigned) = event.unsigned() {
json["unsigned"] = json!(unsigned);
}
serde_json::from_value(json).expect("Failed to serialize Event value")
to_raw_value(&JsonMembers(&members))
.map(Self::from_json)
.expect("Failed to serialize Event value")
}
}
@@ -143,21 +124,20 @@ impl<E: Event> From<Owned<E>> for Raw<AnyStateEvent> {
impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyStateEvent> {
fn from(event: Ref<'a, E>) -> Self {
let event = event.0;
let mut json = json!({
"content": event.content(),
"event_id": event.event_id(),
"origin_server_ts": event.origin_server_ts(),
"room_id": event.room_id(),
"sender": event.sender(),
"state_key": event.state_key(),
"type": event.kind(),
});
let members: [JsonMember<_>; _] = [
("content", Some(event.content().into())),
("event_id", Some(event.event_id().as_str().into())),
("origin_server_ts", Some(event.origin_server_ts().get().into())),
("room_id", Some(event.room_id().as_str().into())),
("sender", Some(event.sender().as_str().into())),
("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
("unsigned", event.unsigned().map(Into::into)),
];
if let Some(unsigned) = event.unsigned() {
json["unsigned"] = json!(unsigned);
}
serde_json::from_value(json).expect("Failed to serialize Event value")
to_raw_value(&JsonMembers(&members))
.map(Self::from_json)
.expect("Failed to serialize Event value")
}
}
@@ -168,20 +148,19 @@ impl<E: Event> From<Owned<E>> for Raw<AnySyncStateEvent> {
impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnySyncStateEvent> {
fn from(event: Ref<'a, E>) -> Self {
let event = event.0;
let mut json = json!({
"content": event.content(),
"event_id": event.event_id(),
"origin_server_ts": event.origin_server_ts(),
"sender": event.sender(),
"state_key": event.state_key(),
"type": event.kind(),
});
let members: [JsonMember<_>; _] = [
("content", Some(event.content().into())),
("event_id", Some(event.event_id().as_str().into())),
("origin_server_ts", Some(event.origin_server_ts().get().into())),
("sender", Some(event.sender().as_str().into())),
("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
("unsigned", event.unsigned().map(Into::into)),
];
if let Some(unsigned) = event.unsigned() {
json["unsigned"] = json!(unsigned);
}
serde_json::from_value(json).expect("Failed to serialize Event value")
to_raw_value(&JsonMembers(&members))
.map(Self::from_json)
.expect("Failed to serialize Event value")
}
}
@@ -192,14 +171,16 @@ impl<E: Event> From<Owned<E>> for Raw<AnyStrippedStateEvent> {
impl<'a, E: Event> From<Ref<'a, E>> for Raw<AnyStrippedStateEvent> {
fn from(event: Ref<'a, E>) -> Self {
let event = event.0;
let json = json!({
"content": event.content(),
"sender": event.sender(),
"state_key": event.state_key(),
"type": event.kind(),
});
let members: [JsonMember<_>; _] = [
("content", Some(event.content().into())),
("sender", Some(event.sender().as_str().into())),
("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
];
serde_json::from_value(json).expect("Failed to serialize Event value")
to_raw_value(&JsonMembers(&members))
.map(Self::from_json)
.expect("Failed to serialize Event value")
}
}
@@ -210,15 +191,17 @@ impl<E: Event> From<Owned<E>> for Raw<HierarchySpaceChildEvent> {
impl<'a, E: Event> From<Ref<'a, E>> for Raw<HierarchySpaceChildEvent> {
fn from(event: Ref<'a, E>) -> Self {
let event = event.0;
let json = json!({
"content": event.content(),
"origin_server_ts": event.origin_server_ts(),
"sender": event.sender(),
"state_key": event.state_key(),
"type": event.kind(),
});
let members: [JsonMember<_>; _] = [
("content", Some(event.content().into())),
("origin_server_ts", Some(event.origin_server_ts().get().into())),
("sender", Some(event.sender().as_str().into())),
("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
];
serde_json::from_value(json).expect("Failed to serialize Event value")
to_raw_value(&JsonMembers(&members))
.map(Self::from_json)
.expect("Failed to serialize Event value")
}
}
@@ -229,21 +212,20 @@ impl<E: Event> From<Owned<E>> for Raw<StateEvent<RoomMemberEventContent>> {
impl<'a, E: Event> From<Ref<'a, E>> for Raw<StateEvent<RoomMemberEventContent>> {
fn from(event: Ref<'a, E>) -> Self {
let event = event.0;
let mut json = json!({
"content": event.content(),
"event_id": event.event_id(),
"origin_server_ts": event.origin_server_ts(),
"redacts": event.redacts(),
"room_id": event.room_id(),
"sender": event.sender(),
"state_key": event.state_key(),
"type": event.kind(),
});
let members: [JsonMember<_>; _] = [
("content", Some(event.content().into())),
("event_id", Some(event.event_id().as_str().into())),
("origin_server_ts", Some(event.origin_server_ts().get().into())),
("redacts", event.redacts().map(|e| e.as_str().into())),
("room_id", Some(event.room_id().as_str().into())),
("sender", Some(event.sender().as_str().into())),
("state_key", event.state_key().map(Into::into)),
("type", Some(event.event_type().to_string().into())),
("unsigned", event.unsigned().map(Into::into)),
];
if let Some(unsigned) = event.unsigned() {
json["unsigned"] = json!(unsigned);
}
serde_json::from_value(json).expect("Failed to serialize Event value")
to_raw_value(&JsonMembers(&members))
.map(Self::from_json)
.expect("Failed to serialize Event value")
}
}