nonzero-char 0.2.1

Implement NonZeroChar, like NonZeroU32
Documentation
#![allow(deprecated)]

use crate::NonZeroChar;
use core::char::ParseCharError;
use core::error::Error;
use core::fmt::{self, Display};
use core::str::FromStr;

#[derive(Debug, Clone, PartialEq, Eq)]
enum ParseNonZeroCharErrorInner {
    ParseCharError(ParseCharError),
    ByZeroError,
}

/// Parse str errors, created by the [`NonZeroChar::from_str`]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ParseNonZeroCharError {
    error: ParseNonZeroCharErrorInner,
}
impl From<ParseCharError> for ParseNonZeroCharError {
    fn from(v: ParseCharError) -> Self {
        ParseNonZeroCharErrorInner::ParseCharError(v).into()
    }
}
impl From<ParseNonZeroCharErrorInner> for ParseNonZeroCharError {
    fn from(error: ParseNonZeroCharErrorInner) -> Self {
        Self { error }
    }
}
impl Error for ParseNonZeroCharError {
    fn description(&self) -> &str {
        match &self.error {
            ParseNonZeroCharErrorInner::ParseCharError(e) => {
                e.description()
            },
            ParseNonZeroCharErrorInner::ByZeroError => {
                "parsed char by zero"
            },
        }
    }
}
impl Display for ParseNonZeroCharError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        self.description().fmt(f)
    }
}

impl FromStr for NonZeroChar {
    type Err = ParseNonZeroCharError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        let ch = char::from_str(s)?;
        NonZeroChar::new(ch)
            .ok_or(ParseNonZeroCharErrorInner::ByZeroError.into())
    }
}