Skip to main content

nonzero_char/
from_str.rs

1#![allow(deprecated)]
2
3use crate::NonZeroChar;
4use core::char::ParseCharError;
5use core::error::Error;
6use core::fmt::{self, Display};
7use core::str::FromStr;
8
9#[derive(Debug, Clone, PartialEq, Eq)]
10enum ParseNonZeroCharErrorInner {
11    ParseCharError(ParseCharError),
12    ByZeroError,
13}
14
15/// Parse str errors, created by the [`NonZeroChar::from_str`]
16#[derive(Debug, Clone, PartialEq, Eq)]
17pub struct ParseNonZeroCharError {
18    error: ParseNonZeroCharErrorInner,
19}
20impl From<ParseCharError> for ParseNonZeroCharError {
21    fn from(v: ParseCharError) -> Self {
22        ParseNonZeroCharErrorInner::ParseCharError(v).into()
23    }
24}
25impl From<ParseNonZeroCharErrorInner> for ParseNonZeroCharError {
26    fn from(error: ParseNonZeroCharErrorInner) -> Self {
27        Self { error }
28    }
29}
30impl Error for ParseNonZeroCharError {
31    fn description(&self) -> &str {
32        match &self.error {
33            ParseNonZeroCharErrorInner::ParseCharError(e) => {
34                e.description()
35            },
36            ParseNonZeroCharErrorInner::ByZeroError => {
37                "parsed char by zero"
38            },
39        }
40    }
41}
42impl Display for ParseNonZeroCharError {
43    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
44        self.description().fmt(f)
45    }
46}
47
48impl FromStr for NonZeroChar {
49    type Err = ParseNonZeroCharError;
50
51    fn from_str(s: &str) -> Result<Self, Self::Err> {
52        let ch = char::from_str(s)?;
53        NonZeroChar::new(ch)
54            .ok_or(ParseNonZeroCharErrorInner::ByZeroError.into())
55    }
56}