mirror of
https://github.com/aljazceru/notedeck.git
synced 2025-12-29 14:04:21 +01:00
This is exactly the same as the DisplayName enum in Damus iOS. Due to the various inconsistencies in `name` and `display_name` between clients, we have to generalize DisplayName into two variants: one name or two names. If we have two names, we treat it in the standard way of display_name is the real name, and `name` is the username. If only one is set, then it is considered both the username and "real name". Signed-off-by: William Casarin <jb55@jb55.com>
40 lines
1011 B
Rust
40 lines
1011 B
Rust
use nostrdb::ProfileRecord;
|
|
|
|
pub enum DisplayName<'a> {
|
|
One(&'a str),
|
|
|
|
Both {
|
|
username: &'a str,
|
|
display_name: &'a str,
|
|
},
|
|
}
|
|
|
|
impl<'a> DisplayName<'a> {
|
|
pub fn username(&self) -> &'a str {
|
|
match self {
|
|
Self::One(n) => n,
|
|
Self::Both { username, .. } => username,
|
|
}
|
|
}
|
|
}
|
|
|
|
fn is_empty(s: &str) -> bool {
|
|
s.chars().all(|c| c.is_whitespace())
|
|
}
|
|
|
|
pub fn get_profile_name<'a>(record: &'a ProfileRecord) -> Option<DisplayName<'a>> {
|
|
let profile = record.record().profile()?;
|
|
let display_name = profile.display_name().filter(|n| !is_empty(n));
|
|
let name = profile.name().filter(|n| !is_empty(n));
|
|
|
|
match (display_name, name) {
|
|
(None, None) => None,
|
|
(Some(disp), None) => Some(DisplayName::One(disp)),
|
|
(None, Some(username)) => Some(DisplayName::One(username)),
|
|
(Some(display_name), Some(username)) => Some(DisplayName::Both {
|
|
display_name,
|
|
username,
|
|
}),
|
|
}
|
|
}
|