arminius_lib_events/
event_id.rs1#[cfg(test)]
8mod tests;
9
10use ruma::{
11 CanonicalJsonObject, CanonicalJsonValue, EventId, OwnedEventId,
12 room_version_rules::EventIdFormatVersion,
13};
14
15use crate::{KnownRoomVersionId, errors::EventIdGenerationError};
16
17pub fn event_id_from_pdu(
30 pdu: &serde_json::value::RawValue,
31 room_version: KnownRoomVersionId,
32) -> Result<OwnedEventId, EventIdGenerationError> {
33 let rules = room_version.rules();
34 let canonical_pdu = serde_json::from_str::<CanonicalJsonObject>(pdu.get())
35 .map_err(|error| EventIdGenerationError::InvalidEvent(error.to_string()))?;
36 match rules.event_id_format {
37 EventIdFormatVersion::V1 => {
38 let Some(CanonicalJsonValue::String(event_id)) = canonical_pdu.get("event_id") else {
39 return Err(EventIdGenerationError::InvalidEvent(
40 "Missing or invalid event_id".to_owned(),
41 ));
42 };
43 EventId::parse(event_id)
44 .map_err(|error| EventIdGenerationError::InvalidEvent(error.to_string()))
45 }
46 EventIdFormatVersion::V2 | EventIdFormatVersion::V3 => {
47 let reference_hash = ruma::signatures::reference_hash(&canonical_pdu, &rules)
48 .map_err(|error| EventIdGenerationError::InvalidEvent(error.to_string()))?;
49 EventId::new_v2_or_v3(&reference_hash)
50 .map_err(|error| EventIdGenerationError::InvalidEvent(error.to_string()))
51 }
52 _ => Err(EventIdGenerationError::InvalidEvent("Unsupported event ID format".to_owned())),
53 }
54}