From 21eb8d4fe30b86a9b9f9b9e42e9b8df8de384fc6 Mon Sep 17 00:00:00 2001 From: timokoesters Date: Mon, 27 Jul 2020 21:53:28 +0200 Subject: [PATCH] fix: problems with pdu serialization --- Cargo.lock | 3 ++ Cargo.toml | 2 +- src/pdu.rs | 108 +++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 88 insertions(+), 25 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 37a620b..e40fd09 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1485,6 +1485,7 @@ dependencies = [ [[package]] name = "rocket" version = "0.5.0-dev" +source = "git+https://github.com/timokoesters/Rocket.git?branch=empty_parameters#f383f15047d0dda71dd21399dfea96161fe2bd0e" dependencies = [ "async-trait", "atomic", @@ -1509,6 +1510,7 @@ dependencies = [ [[package]] name = "rocket_codegen" version = "0.5.0-dev" +source = "git+https://github.com/timokoesters/Rocket.git?branch=empty_parameters#f383f15047d0dda71dd21399dfea96161fe2bd0e" dependencies = [ "devise", "glob", @@ -1520,6 +1522,7 @@ dependencies = [ [[package]] name = "rocket_http" version = "0.5.0-dev" +source = "git+https://github.com/timokoesters/Rocket.git?branch=empty_parameters#f383f15047d0dda71dd21399dfea96161fe2bd0e" dependencies = [ "cookie", "http", diff --git a/Cargo.toml b/Cargo.toml index e5df8dd..de8fb47 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ edition = "2018" [dependencies] # TODO: This can become optional as soon as proper configs are supported #rocket = { git = "https://github.com/SergioBenitez/Rocket.git", rev = "8d779caa22c63b15a6c3ceb75d8f6d4971b2eb67", features = ["tls"] } # Used to handle requests -rocket = { path = "../rocket/core/lib", features = ["tls"] } +rocket = { git = "https://github.com/timokoesters/Rocket.git", branch = "empty_parameters", features = ["tls"] } tokio = "0.2.22" # Used for long polling ruma = { git = "https://github.com/ruma/ruma", features = ["rand", "client-api", "federation-api", "unstable-pre-spec", "unstable-synapse-quirks"], rev = "d5d2d1d893fa12d27960e4c58d6c09b215d06e95" } # Used for matrix spec type definitions and helpers diff --git a/src/pdu.rs b/src/pdu.rs index 0cfdb63..c149297 100644 --- a/src/pdu.rs +++ b/src/pdu.rs @@ -79,39 +79,99 @@ impl PduEvent { } pub fn to_sync_room_event(&self) -> Raw { - let json = serde_json::to_string(&self).expect("PDUs are always valid"); - serde_json::from_str::(&json) - .map(Raw::from) - .expect("AnySyncRoomEvent can always be built from a full PDU event") + let mut json = json!({ + "content": self.content, + "type": self.kind, + "event_id": self.event_id, + "sender": self.sender, + "origin_server_ts": self.origin_server_ts, + "unsigned": self.unsigned, + }); + + if let Some(state_key) = &self.state_key { + json["state_key"] = json!(state_key); + } + if let Some(redacts) = &self.redacts { + json["redacts"] = json!(redacts); + } + + serde_json::from_value(json).expect("Raw::from_value always works") } + pub fn to_room_event(&self) -> Raw { - let json = serde_json::to_string(&self).expect("PDUs are always valid"); - serde_json::from_str::(&json) - .map(Raw::from) - .expect("AnyRoomEvent can always be built from a full PDU event") + let mut json = json!({ + "content": self.content, + "type": self.kind, + "event_id": self.event_id, + "sender": self.sender, + "origin_server_ts": self.origin_server_ts, + "unsigned": self.unsigned, + "room_id": self.room_id, + }); + + if let Some(state_key) = &self.state_key { + json["state_key"] = json!(state_key); + } + if let Some(redacts) = &self.redacts { + json["redacts"] = json!(redacts); + } + + serde_json::from_value(json).expect("Raw::from_value always works") } + pub fn to_state_event(&self) -> Raw { - let json = serde_json::to_string(&self).expect("PDUs are always valid"); - serde_json::from_str::(&json) - .map(Raw::from) - .expect("AnyStateEvent can always be built from a full PDU event") + let json = json!({ + "content": self.content, + "type": self.kind, + "event_id": self.event_id, + "sender": self.sender, + "origin_server_ts": self.origin_server_ts, + "unsigned": self.unsigned, + "room_id": self.room_id, + "state_key": self.state_key, + }); + + serde_json::from_value(json).expect("Raw::from_value always works") } + pub fn to_sync_state_event(&self) -> Raw { - let json = serde_json::to_string(&self).expect("PDUs are always valid"); - serde_json::from_str::(&json) - .map(Raw::from) - .expect("AnySyncStateEvent can always be built from a full PDU event") + let json = json!({ + "content": self.content, + "type": self.kind, + "event_id": self.event_id, + "sender": self.sender, + "origin_server_ts": self.origin_server_ts, + "unsigned": self.unsigned, + "state_key": self.state_key, + }); + + serde_json::from_value(json).expect("Raw::from_value always works") } + pub fn to_stripped_state_event(&self) -> Raw { - let json = serde_json::to_string(&self).expect("PDUs are always valid"); - serde_json::from_str::(&json) - .map(Raw::from) - .expect("AnyStrippedStateEvent can always be built from a full PDU event") + let json = json!({ + "content": self.content, + "type": self.kind, + "sender": self.sender, + "state_key": self.state_key, + }); + + serde_json::from_value(json).expect("Raw::from_value always works") } + pub fn to_member_event(&self) -> Raw> { - let json = serde_json::to_string(&self).expect("PDUs are always valid"); - serde_json::from_str::>(&json) - .map(Raw::from) - .expect("StateEvent can always be built from a full PDU event") + let json = json!({ + "content": self.content, + "type": self.kind, + "event_id": self.event_id, + "sender": self.sender, + "origin_server_ts": self.origin_server_ts, + "redacts": self.redacts, + "unsigned": self.unsigned, + "room_id": self.room_id, + "state_key": self.state_key, + }); + + serde_json::from_value(json).expect("Raw::from_value always works") } }