1use serde::de::{self, Deserializer, MapAccess, Visitor};
6use serde::{Deserialize, Serialize};
7use std::fmt;
8
9#[derive(Debug, Serialize, Default, Clone)]
17pub struct FreeInfo(pub Option<String>);
18
19impl<'de> Deserialize<'de> for FreeInfo {
20 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
21 where
22 D: Deserializer<'de>,
23 {
24 deserializer.deserialize_any(FreeInfoVisitor)
25 }
26}
27
28struct FreeInfoVisitor;
29
30impl<'de> Visitor<'de> for FreeInfoVisitor {
31 type Value = FreeInfo;
32
33 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
34 formatter.write_str("a string or any element (which will be skipped)")
35 }
36
37 fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
39 where
40 E: de::Error,
41 {
42 let trimmed = value.trim();
43 Ok(FreeInfo((!trimmed.is_empty()).then(|| trimmed.to_string())))
44 }
45
46 fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
48 where
49 A: MapAccess<'de>,
50 {
51 while map.next_entry::<de::IgnoredAny, de::IgnoredAny>()?.is_some() {}
52 Ok(FreeInfo(None))
53 }
54}