expo_push_notification_client 1.0.3

Expo Push Notification Client for Rust
Documentation
#[derive(
    Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, serde::Deserialize, serde::Serialize,
)]
pub struct ExpoPushReceiptId(String);

impl std::convert::From<ExpoPushReceiptId> for String {
    fn from(expo_push_receipt_id: ExpoPushReceiptId) -> Self {
        expo_push_receipt_id.0
    }
}

impl std::convert::TryFrom<&str> for ExpoPushReceiptId {
    type Error = crate::CustomError;

    fn try_from(s: &str) -> Result<Self, Self::Error> {
        Ok(Self(s.to_string()))
    }
}

impl std::convert::TryFrom<String> for ExpoPushReceiptId {
    type Error = crate::CustomError;

    fn try_from(s: String) -> Result<Self, Self::Error> {
        Ok(Self(s))
    }
}

impl std::fmt::Display for ExpoPushReceiptId {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.0)
    }
}

impl std::str::FromStr for ExpoPushReceiptId {
    type Err = crate::CustomError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        Self::try_from(s)
    }
}

#[cfg(test)]
mod tests {
    use std::{
        clone::Clone,
        cmp::Eq,
        fmt::{Debug, Display},
        hash::Hash,
        str::FromStr,
    };

    use super::*;

    #[test]
    fn test_impls() -> anyhow::Result<()> {
        fn assert_clone<T: Clone>() {}
        fn assert_debug<T: Debug>() {}
        fn assert_deserialize<'a, T: serde::Deserialize<'a>>() {}
        fn assert_deserialize_owned<T: serde::de::DeserializeOwned>() {}
        fn assert_display<T: Display>() {}
        fn assert_eq<T: Eq>() {}
        fn assert_from_str<T: FromStr>() {}
        fn assert_hash<T: Hash>() {}
        fn assert_ord<T: Ord>() {}
        fn assert_partial_eq<T: PartialEq>() {}
        fn assert_partial_ord<T: PartialOrd>() {}
        fn assert_send<T: Send>() {}
        fn assert_serialize<T: serde::Serialize>() {}
        fn assert_sync<T: Sync>() {}
        fn assert_try_from<T: TryFrom<String>>() {}
        assert_clone::<ExpoPushReceiptId>();
        assert_debug::<ExpoPushReceiptId>();
        assert_deserialize::<ExpoPushReceiptId>();
        assert_deserialize_owned::<ExpoPushReceiptId>();
        assert_display::<ExpoPushReceiptId>();
        assert_eq::<ExpoPushReceiptId>();
        assert_from_str::<ExpoPushReceiptId>();
        assert_hash::<ExpoPushReceiptId>();
        assert_ord::<ExpoPushReceiptId>();
        assert_partial_eq::<ExpoPushReceiptId>();
        assert_partial_ord::<ExpoPushReceiptId>();
        assert_send::<ExpoPushReceiptId>();
        assert_serialize::<ExpoPushReceiptId>();
        assert_sync::<ExpoPushReceiptId>();
        assert_try_from::<ExpoPushReceiptId>();
        Ok(())
    }

    #[test]
    fn test_string_conversion() -> anyhow::Result<()> {
        let s = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
        assert_eq!(String::from(ExpoPushReceiptId::try_from(s.to_string())?), s);
        assert_eq!(format!("{}", ExpoPushReceiptId::from_str(s)?), s);
        Ok(())
    }
}