ruma_events/room/
language.rs

1//! Types for the [`m.room.language`] event.
2//!
3//! [`m.room.language`]: https://github.com/matrix-org/matrix-spec-proposals/pull/4334
4
5use language_tags::LanguageTag;
6use ruma_macros::EventContent;
7use serde::{Deserialize, Serialize};
8
9use crate::EmptyStateKey;
10
11/// The content of an `org.matrix.msc4334.room.language` event.
12///
13/// The room language is a [IETF BCP 47](https://datatracker.ietf.org/doc/bcp47/) language code.
14#[derive(Clone, Debug, Deserialize, Serialize, EventContent)]
15#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
16#[ruma_event(type = "org.matrix.msc4334.room.language", kind = State, state_key_type = EmptyStateKey)]
17pub struct RoomLanguageEventContent {
18    /// The language of the room.
19    pub language: LanguageTag,
20}
21
22impl RoomLanguageEventContent {
23    /// Create a new `RoomLanguageEventContent` with the given language.
24    pub fn new(language: LanguageTag) -> Self {
25        Self { language }
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use ruma_common::canonical_json::assert_to_canonical_json_eq;
32    use serde_json::{from_value as from_json_value, json};
33
34    use super::RoomLanguageEventContent;
35    use crate::{OriginalStateEvent, room::language::LanguageTag};
36
37    #[test]
38    fn serialization() {
39        let content = RoomLanguageEventContent { language: LanguageTag::parse("fr").unwrap() };
40
41        assert_to_canonical_json_eq!(
42            content,
43            json!({
44                "language": "fr",
45            }),
46        );
47    }
48
49    #[test]
50    fn deserialization() {
51        let json_data = json!({
52            "content": {
53                "language": "fr"
54            },
55            "event_id": "$h29iv0s8:example.com",
56            "origin_server_ts": 1,
57            "room_id": "!n8f893n9:example.com",
58            "sender": "@carl:example.com",
59            "state_key": "",
60            "type": "org.matrix.msc4334.room.language"
61        });
62
63        assert_eq!(
64            from_json_value::<OriginalStateEvent<RoomLanguageEventContent>>(json_data)
65                .unwrap()
66                .content
67                .language,
68            LanguageTag::parse("fr").unwrap()
69        );
70    }
71}