Skip to main content

sashite_pin/
serde_impl.rs

1//! `serde` support for [`Identifier`], compiled only with the `serde` feature.
2//!
3//! An identifier serializes as its canonical token string (for example `"+K^"`)
4//! and deserializes by parsing that string. The implementation is `no_std`:
5//! serialization borrows a stack buffer and deserialization borrows the input.
6
7use core::fmt;
8
9use serde::de::{self, Visitor};
10use serde::{Deserialize, Deserializer, Serialize, Serializer};
11
12use crate::Identifier;
13
14impl Serialize for Identifier {
15    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
16    where
17        S: Serializer,
18    {
19        serializer.serialize_str(self.encode().as_str())
20    }
21}
22
23impl<'de> Deserialize<'de> for Identifier {
24    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
25    where
26        D: Deserializer<'de>,
27    {
28        struct IdentifierVisitor;
29
30        impl Visitor<'_> for IdentifierVisitor {
31            type Value = Identifier;
32
33            fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34                f.write_str("a PIN token string")
35            }
36
37            fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
38            where
39                E: de::Error,
40            {
41                Identifier::parse(value).map_err(de::Error::custom)
42            }
43        }
44
45        deserializer.deserialize_str(IdentifierVisitor)
46    }
47}