mastodon API rust lib elefren, fixed and updated. and also all ASYNC! NB. most examples are now wrong.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
elefren-fork/src/entities/notification.rs

63 lines
1.9 KiB

//! Module containing all info about notifications.
use super::{account::Account, status::Status};
use chrono::prelude::*;
use serde::Deserialize;
/// A struct containing info about a notification.
#[derive(Debug, Clone, Deserialize, PartialEq)]
pub struct Notification {
/// The notification ID.
pub id: String,
/// The type of notification.
#[serde(rename = "type")]
pub notification_type: NotificationType,
/// The time the notification was created.
pub created_at: DateTime<Utc>,
/// The Account sending the notification to the user.
pub account: Account,
/// The Status associated with the notification, if applicable.
pub status: Option<Status>,
}
/// The type of notification.
#[derive(Debug, Clone, Deserialize, PartialEq)]
#[serde(rename_all = "lowercase")]
// Deserialize "Other" trick from https://github.com/serde-rs/serde/issues/912#issuecomment-803097289
#[serde(remote = "NotificationType")]
pub enum NotificationType {
/// Someone mentioned the application client in another status.
Mention,
/// Someone reblogged one of the application client's statuses.
Reblog,
/// Someone favourited one of the application client's statuses.
Favourite,
/// Someone followed the application client.
Follow,
/// Anything else
#[serde(skip_deserializing)]
Other(String),
}
use std::str::FromStr;
use serde::de::{value, Deserializer, IntoDeserializer};
impl FromStr for NotificationType {
type Err = value::Error;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Self::deserialize(s.into_deserializer())
}
}
impl<'de> Deserialize<'de> for NotificationType {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer<'de>
{
let s = String::deserialize(deserializer)?;
let deserialized = Self::from_str(&s).unwrap_or_else(|_| {
Self::Other(s)
});
Ok(deserialized)
}
}