use js_int::UInt; use ruma_events::{ collections::all::RoomEvent, stripped::AnyStrippedStateEvent, EventResult, EventType, }; use ruma_federation_api::EventHash; use ruma_identifiers::{EventId, RoomId, UserId}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; #[derive(Deserialize, Serialize)] pub struct PduEvent { pub event_id: EventId, pub room_id: RoomId, pub sender: UserId, pub origin: String, pub origin_server_ts: UInt, #[serde(rename = "type")] pub kind: EventType, pub content: serde_json::Value, #[serde(skip_serializing_if = "Option::is_none")] pub state_key: Option, pub prev_events: Vec, pub depth: UInt, pub auth_events: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub redacts: Option, #[serde(default, skip_serializing_if = "serde_json::Map::is_empty")] pub unsigned: serde_json::Map, pub hashes: EventHash, pub signatures: HashMap>, } impl PduEvent { // TODO: This shouldn't be an option pub fn to_room_event(&self) -> Option { // Can only fail in rare circumstances that won't ever happen here, see // https://docs.rs/serde_json/1.0.50/serde_json/fn.to_string.html let json = serde_json::to_string(&self).unwrap(); // EventResult's deserialize implementation always returns `Ok(...)` Some( serde_json::from_str::>(&json) .unwrap() .into_result() .ok()?, ) } pub fn to_stripped_state_event(&self) -> Option { // Can only fail in rare circumstances that won't ever happen here, see // https://docs.rs/serde_json/1.0.50/serde_json/fn.to_string.html let json = serde_json::to_string(&self).unwrap(); // EventResult's deserialize implementation always returns `Ok(...)` serde_json::from_str::>(&json) .unwrap() .into_result() .ok() } }