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#[derive(Debug, Clone, PartialEq, Eq)]
16pub struct ParseNonZeroCharError {
17    error: ParseNonZeroCharErrorInner,
18}
19impl From<ParseCharError> for ParseNonZeroCharError {
20    fn from(v: ParseCharError) -> Self {
21        ParseNonZeroCharErrorInner::ParseCharError(v).into()
22    }
23}
24impl From<ParseNonZeroCharErrorInner> for ParseNonZeroCharError {
25    fn from(error: ParseNonZeroCharErrorInner) -> Self {
26        Self { error }
27    }
28}
29impl Error for ParseNonZeroCharError {
30    fn description(&self) -> &str {
31        match &self.error {
32            ParseNonZeroCharErrorInner::ParseCharError(e) => {
33                e.description()
34            },
35            ParseNonZeroCharErrorInner::ByZeroError => {
36                "parsed char by zero"
37            },
38        }
39    }
40}
41impl Display for ParseNonZeroCharError {
42    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43        self.description().fmt(f)
44    }
45}
46impl FromStr for NonZeroChar {
47    type Err = ParseNonZeroCharError;
48
49    fn from_str(s: &str) -> Result<Self, Self::Err> {
50        let ch = char::from_str(s)?;
51        NonZeroChar::new(ch)
52            .ok_or(ParseNonZeroCharErrorInner::ByZeroError.into())
53    }
54}