teloxide/src/types/user.rs

72 lines
2 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

use serde::{Deserialize, Serialize};
/// This object represents a Telegram user or bot.
///
/// [The official docs](https://core.telegram.org/bots/api#user).
#[serde_with_macros::skip_serializing_none]
#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
pub struct User {
/// Unique identifier for this user or bot.
pub id: i64,
/// `true`, if this user is a bot.
pub is_bot: bool,
/// Users or bots first name.
pub first_name: String,
/// Users or bots last name.
pub last_name: Option<String>,
/// Users or bots username.
pub username: Option<String>,
/// [IETF language tag] of the user's language.
///
/// [IETF language tag]: https://en.wikipedia.org/wiki/IETF_language_tag
pub language_code: Option<String>,
}
impl User {
pub fn full_name(&self) -> String {
match &self.last_name {
Some(last_name) => (format!("{0} {1}", self.first_name, last_name)),
None => self.first_name.clone(),
}
}
pub fn mention(&self) -> Option<String> {
Some(format!("@{}", self.username.as_ref()?))
}
pub fn url(&self) -> reqwest::Url {
reqwest::Url::parse(format!("tg://user/?id={}", self.id).as_str()).unwrap()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn deserialize() {
let json = r#"{
"id":12345,
"is_bot":false,
"first_name":"firstName",
"last_name":"lastName",
"username":"Username",
"language_code":"ru"
}"#;
let expected = User {
id: 12345,
is_bot: false,
first_name: "firstName".to_string(),
last_name: Some("lastName".to_string()),
username: Some("Username".to_string()),
language_code: Some(String::from("ru")),
};
let actual = serde_json::from_str::<User>(json).unwrap();
assert_eq!(actual, expected)
}
}