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 serde_json::{from_value as from_json_value, json, to_value as to_json_value};
32
33    use super::RoomLanguageEventContent;
34    use crate::{room::language::LanguageTag, OriginalStateEvent};
35
36    #[test]
37    fn serialization() {
38        let content = RoomLanguageEventContent { language: LanguageTag::parse("fr").unwrap() };
39
40        let actual = to_json_value(content).unwrap();
41        let expected = json!({
42            "language": "fr",
43        });
44
45        assert_eq!(actual, expected);
46    }
47
48    #[test]
49    fn deserialization() {
50        let json_data = json!({
51            "content": {
52                "language": "fr"
53            },
54            "event_id": "$h29iv0s8:example.com",
55            "origin_server_ts": 1,
56            "room_id": "!n8f893n9:example.com",
57            "sender": "@carl:example.com",
58            "state_key": "",
59            "type": "org.matrix.msc4334.room.language"
60        });
61
62        assert_eq!(
63            from_json_value::<OriginalStateEvent<RoomLanguageEventContent>>(json_data)
64                .unwrap()
65                .content
66                .language,
67            LanguageTag::parse("fr").unwrap()
68        );
69    }
70}