io_keyring/
serde.rs

1//! Module dedicated to [`serde`] de/serialization of [`KeyringEntry`].
2
3use 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    // TODO
48    // #[test]
49    // fn serialize() {
50    //
51    // }
52
53    #[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}