acter_core/models/status/
profile.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use matrix_sdk_base::ruma::{OwnedMxcUri, OwnedUserId};
use matrix_sdk_ui::timeline::MemberProfileChange;
use serde::{Deserialize, Serialize};

// ruma_events::room::member::change::Change doesn't support serialization
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Change<T> {
    /// The old data.
    pub old_val: T,

    /// The new data.
    pub new_val: T,
}

impl<T: PartialEq> Change<T> {
    pub fn new(old_val: T, new_val: T) -> Option<Self> {
        if old_val == new_val {
            None
        } else {
            Some(Self { old_val, new_val })
        }
    }
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ProfileContent {
    user_id: OwnedUserId,
    display_name_change: Option<Change<Option<String>>>,
    avatar_url_change: Option<Change<Option<OwnedMxcUri>>>,
}

impl From<&MemberProfileChange> for ProfileContent {
    fn from(value: &MemberProfileChange) -> Self {
        ProfileContent {
            user_id: value.user_id().to_owned(),
            display_name_change: value
                .displayname_change()
                .and_then(|c| Change::new(c.new.clone(), c.old.clone())),
            avatar_url_change: value
                .avatar_url_change()
                .and_then(|c| Change::new(c.new.clone(), c.old.clone())),
        }
    }
}

impl ProfileContent {
    pub(crate) fn new(
        user_id: OwnedUserId,
        display_name_change: Option<Change<Option<String>>>,
        avatar_url_change: Option<Change<Option<OwnedMxcUri>>>,
    ) -> Self {
        ProfileContent {
            user_id,
            display_name_change,
            avatar_url_change,
        }
    }

    pub fn user_id(&self) -> OwnedUserId {
        self.user_id.clone()
    }

    pub fn display_name_change(&self) -> Option<String> {
        if let Some(c) = &self.display_name_change {
            match (c.new_val.clone(), c.old_val.clone()) {
                (Some(new_val), Some(old_val)) => {
                    if new_val != old_val {
                        return Some("Changed".to_owned());
                    }
                }
                (None, Some(_old_val)) => {
                    return Some("Unset".to_owned());
                }
                (Some(_new_val), None) => {
                    return Some("Set".to_owned());
                }
                (None, None) => {}
            }
        }
        None
    }

    pub fn display_name_old_val(&self) -> Option<String> {
        self.display_name_change
            .as_ref()
            .and_then(|c| c.old_val.clone())
    }

    pub fn display_name_new_val(&self) -> Option<String> {
        self.display_name_change
            .as_ref()
            .and_then(|c| c.new_val.clone())
    }

    pub fn avatar_url_change(&self) -> Option<String> {
        if let Some(c) = &self.avatar_url_change {
            match (c.new_val.clone(), c.old_val.clone()) {
                (Some(new_val), Some(old_val)) => {
                    if new_val != old_val {
                        return Some("Changed".to_owned());
                    }
                }
                (None, Some(_old_val)) => {
                    return Some("Unset".to_owned());
                }
                (Some(_new_val), None) => {
                    return Some("Set".to_owned());
                }
                (None, None) => {}
            }
        }
        None
    }

    pub fn avatar_url_old_val(&self) -> Option<OwnedMxcUri> {
        self.avatar_url_change
            .as_ref()
            .and_then(|c| c.old_val.clone())
    }

    pub fn avatar_url_new_val(&self) -> Option<OwnedMxcUri> {
        self.avatar_url_change
            .as_ref()
            .and_then(|c| c.new_val.clone())
    }
}