tuwunel_core/matrix/event/
unsigned.rs1use serde::Deserialize;
2use serde_json::value::{RawValue as RawJsonValue, Value as JsonValue};
3
4use super::Event;
5use crate::{Result, err, is_true};
6
7pub(super) fn contains_unsigned_property<F, E>(event: &E, property: &str, is_type: F) -> bool
8where
9 F: FnOnce(&JsonValue) -> bool,
10 E: Event,
11{
12 get_unsigned_as_value(event)
13 .get(property)
14 .map(is_type)
15 .is_some_and(is_true!())
16}
17
18pub(super) fn get_unsigned_property<T, E>(event: &E, property: &str) -> Result<T>
19where
20 T: for<'de> Deserialize<'de>,
21 E: Event,
22{
23 get_unsigned_as_value(event)
24 .get_mut(property)
25 .map(JsonValue::take)
26 .map(serde_json::from_value)
27 .ok_or(err!(Request(NotFound("property not found in unsigned object"))))?
28 .map_err(|e| err!(Database("Failed to deserialize unsigned.{property} into type: {e}")))
29}
30
31#[must_use]
32pub(super) fn get_unsigned_as_value<E>(event: &E) -> JsonValue
33where
34 E: Event,
35{
36 get_unsigned::<JsonValue, E>(event).unwrap_or_default()
37}
38
39pub(super) fn get_unsigned<T, E>(event: &E) -> Result<T>
40where
41 T: for<'de> Deserialize<'de>,
42 E: Event,
43{
44 event
45 .unsigned()
46 .map(RawJsonValue::get)
47 .map(serde_json::from_str)
48 .ok_or(err!(Request(NotFound("\"unsigned\" property not found in pdu"))))?
49 .map_err(|e| err!(Database("Failed to deserialize \"unsigned\" into value: {e}")))
50}