synd-client 0.4.0

syndicationd API client
Documentation
use serde::{Deserialize, Deserializer, Serializer, de};
use synd_feed::types::Requirement;

const VARIANTS: &[&str] = &["MUST", "SHOULD", "MAY"];

#[allow(clippy::ref_option, clippy::trivially_copy_pass_by_ref)]
pub(super) fn serialize<S>(value: &Option<Requirement>, serializer: S) -> Result<S::Ok, S::Error>
where
    S: Serializer,
{
    match value {
        Some(Requirement::Must) => serializer.serialize_some("MUST"),
        Some(Requirement::Should) => serializer.serialize_some("SHOULD"),
        Some(Requirement::May) => serializer.serialize_some("MAY"),
        None => serializer.serialize_none(),
    }
}

pub(super) fn deserialize<'de, D>(deserializer: D) -> Result<Option<Requirement>, D::Error>
where
    D: Deserializer<'de>,
{
    let Some(value) = Option::<String>::deserialize(deserializer)? else {
        return Ok(None);
    };

    match value.as_str() {
        "MUST" => Ok(Some(Requirement::Must)),
        "SHOULD" => Ok(Some(Requirement::Should)),
        "MAY" => Ok(Some(Requirement::May)),
        value => Err(de::Error::unknown_variant(value, VARIANTS)),
    }
}