color_char/character/
der.rs

1use std::fmt::Formatter;
2
3use serde::{
4    de::{Error, Visitor},
5    Deserialize, Deserializer,
6};
7
8use crate::Character;
9
10struct CharacterVisitor;
11
12impl<'de> Deserialize<'de> for Character {
13    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
14    where
15        D: Deserializer<'de>,
16    {
17        deserializer.deserialize_any(CharacterVisitor)
18    }
19}
20
21impl<'de> Visitor<'de> for CharacterVisitor {
22    type Value = Character;
23
24    fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
25        formatter.write_str("Expecting a character")
26    }
27
28    fn visit_u32<E>(self, value: u32) -> Result<Self::Value, E>
29    where
30        E: Error,
31    {
32        Ok(Character::from(value))
33    }
34
35    fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
36    where
37        E: Error,
38    {
39        if value.len() != 1 {
40            return Err(E::invalid_length(value.len(), &self));
41        }
42        unsafe { Ok(Character::from(value.chars().next().unwrap_unchecked())) }
43    }
44}