color_char/character/
der.rs1use 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}