ruma_state_res/events/
join_rules.rs

1//! Types to deserialize `m.room.join_rules` events.
2
3use std::ops::Deref;
4
5use ruma_common::{room::JoinRuleKind, serde::from_raw_json_value};
6use serde::Deserialize;
7
8use super::Event;
9
10/// A helper type for an [`Event`] of type `m.room.join_rules`.
11///
12/// This is a type that deserializes each field lazily, when requested.
13#[derive(Debug, Clone)]
14pub struct RoomJoinRulesEvent<E: Event>(E);
15
16impl<E: Event> RoomJoinRulesEvent<E> {
17    /// Construct a new `RoomJoinRulesEvent` around the given event.
18    pub fn new(event: E) -> Self {
19        Self(event)
20    }
21
22    /// The join rule of the room.
23    pub fn join_rule(&self) -> Result<JoinRuleKind, String> {
24        #[derive(Deserialize)]
25        struct RoomJoinRulesContentJoinRule {
26            join_rule: JoinRuleKind,
27        }
28
29        let content: RoomJoinRulesContentJoinRule =
30            from_raw_json_value(self.content()).map_err(|err: serde_json::Error| {
31                format!("missing or invalid `join_rule` field in `m.room.join_rules` event: {err}")
32            })?;
33        Ok(content.join_rule)
34    }
35}
36
37impl<E: Event> Deref for RoomJoinRulesEvent<E> {
38    type Target = E;
39
40    fn deref(&self) -> &Self::Target {
41        &self.0
42    }
43}