1use std::fmt;
4
5use serde::{
6 de::{Error, Visitor},
7 Deserialize, Deserializer, Serialize, Serializer,
8};
9
10use crate::entry::KeyringEntry;
11
12impl Serialize for KeyringEntry {
13 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
14 serializer.serialize_str(&self.name)
15 }
16}
17
18impl<'de> Deserialize<'de> for KeyringEntry {
19 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<KeyringEntry, D::Error> {
20 deserializer.deserialize_string(EntryVisitor)
21 }
22}
23
24struct EntryVisitor;
25
26impl<'de> Visitor<'de> for EntryVisitor {
27 type Value = KeyringEntry;
28
29 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
30 formatter.write_str("a keyring entry name (string)")
31 }
32
33 fn visit_str<E: Error>(self, v: &str) -> Result<Self::Value, E> {
34 Ok(KeyringEntry::new(v))
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use serde::{
41 de::value::{Error, StringDeserializer},
42 Deserialize,
43 };
44
45 use crate::entry::KeyringEntry;
46
47 #[test]
54 fn deserialize() {
55 let expected = KeyringEntry::new("name");
56
57 let s = String::from("name");
58 let s = StringDeserializer::<Error>::new(s);
59 let got = KeyringEntry::deserialize(s).unwrap();
60
61 assert_eq!(expected, got);
62 }
63}