| 1 | use super::AsciiByte; |
| 2 | |
| 3 | pub(crate) struct PatternCtor<T>(pub(crate) T); |
| 4 | |
| 5 | impl PatternCtor<u8> { |
| 6 | pub(crate) const fn conv(self) -> Pattern { |
| 7 | Pattern::AsciiByte(AsciiByte::new(self.0)) |
| 8 | } |
| 9 | } |
| 10 | |
| 11 | impl PatternCtor<&'static str> { |
| 12 | pub(crate) const fn conv(self) -> Pattern { |
| 13 | if let [b: u8 @ 0..=127] = *self.0.as_bytes() { |
| 14 | Pattern::AsciiByte(AsciiByte::new(byte:b)) |
| 15 | } else { |
| 16 | Pattern::Str(self.0) |
| 17 | } |
| 18 | } |
| 19 | } |
| 20 | |
| 21 | impl PatternCtor<char> { |
| 22 | pub(crate) const fn conv(self) -> Pattern { |
| 23 | let code: u32 = self.0 as u32; |
| 24 | if let c: u32 @ 0..=127 = code { |
| 25 | Pattern::AsciiByte(AsciiByte::new(byte:c as u8)) |
| 26 | } else { |
| 27 | Pattern::Char(crate::char_encoding::char_to_display(self.0)) |
| 28 | } |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | #[derive (Copy, Clone)] |
| 33 | pub(crate) enum Pattern { |
| 34 | AsciiByte(AsciiByte), |
| 35 | Str(&'static str), |
| 36 | Char(crate::char_encoding::FmtChar), |
| 37 | } |
| 38 | |
| 39 | pub(crate) enum PatternNorm<'a> { |
| 40 | AsciiByte(AsciiByte), |
| 41 | Str(&'a [u8]), |
| 42 | } |
| 43 | |
| 44 | impl Pattern { |
| 45 | pub(crate) const fn normalize(&self) -> PatternNorm<'_> { |
| 46 | match self { |
| 47 | Pattern::AsciiByte(ab: &AsciiByte) => PatternNorm::AsciiByte(*ab), |
| 48 | Pattern::Str(str: &&'static str) => PatternNorm::Str(str.as_bytes()), |
| 49 | Pattern::Char(char: &FmtChar) => PatternNorm::Str(char.as_bytes()), |
| 50 | } |
| 51 | } |
| 52 | } |
| 53 | |