expo_push_notification_client 2.0.2

Expo Push Notification Client for Rust
Documentation
use serde::{Deserialize, Deserializer, Serialize, Serializer};

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Sound {
    Default,
    Custom(String),
}

impl Serialize for Sound {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        match self {
            Sound::Default => serializer.serialize_str("default"),
            Sound::Custom(s) => serializer.serialize_str(s),
        }
    }
}

impl<'de> Deserialize<'de> for Sound {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;
        if s == "default" {
            Ok(Sound::Default)
        } else {
            Ok(Sound::Custom(s))
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_serialization() -> Result<(), serde_json::Error> {
        assert_eq!(serde_json::to_string(&Sound::Default)?, "\"default\"");
        assert_eq!(
            serde_json::to_string(&Sound::Custom("bells.wav".to_string()))?,
            "\"bells.wav\""
        );
        assert_eq!(
            serde_json::to_string(&Sound::Custom("custom_sound.mp3".to_string()))?,
            "\"custom_sound.mp3\""
        );
        Ok(())
    }

    #[test]
    fn test_deserialization() -> Result<(), serde_json::Error> {
        assert_eq!(
            serde_json::from_str::<Sound>("\"default\"")?,
            Sound::Default
        );
        assert_eq!(
            serde_json::from_str::<Sound>("\"bells.wav\"")?,
            Sound::Custom("bells.wav".to_string())
        );
        assert_eq!(
            serde_json::from_str::<Sound>("\"custom_sound.mp3\"")?,
            Sound::Custom("custom_sound.mp3".to_string())
        );
        Ok(())
    }
}