badgeland 0.13.0

Fast badge generator for any purpose
Documentation
use crate::SizeError;
use std::{fmt, str::FromStr};

#[cfg(feature = "serde_de")]
use serde::{de, Deserialize, Deserializer, Serialize};

#[derive(Debug, PartialEq, Copy, Clone, Default)]
#[cfg_attr(feature = "serde_de", derive(Serialize))]
pub enum Size {
    Large,
    Medium,
    #[default]
    Small,
}

impl fmt::Display for Size {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        let s = match self {
            Size::Large => "Large",
            Size::Medium => "Medium",
            Size::Small => "Small",
        };
        write!(f, "{}", s)
    }
}

#[cfg(feature = "serde_de")]
impl<'de> Deserialize<'de> for Size {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let s = String::deserialize(deserializer)?;

        Size::from_str(s.as_str()).map_err(de::Error::custom)
    }
}

impl FromStr for Size {
    type Err = SizeError;
    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s.to_lowercase().as_ref() {
            "large" | "l" => Ok(Size::Large),
            "medium" | "m" => Ok(Size::Medium),
            "small" | "s" => Ok(Size::Small),
            _ => Err(SizeError {}),
        }
    }
}