Skip to main content

tuwunel_core/matrix/event/
unsigned.rs

1use 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}