Skip to main content

prefixed_tsid/
serde.rs

1use std::{marker::PhantomData, str::FromStr};
2
3use serde::{
4    Deserialize, Serialize,
5    de::{Unexpected, Visitor},
6};
7
8use crate::{resources::TSIDResource, tsid::TSIDDatabaseID};
9
10impl<Resource: TSIDResource> Serialize for TSIDDatabaseID<Resource> {
11    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
12    where
13        S: serde::Serializer,
14    {
15        serializer.serialize_str(&self.to_string())
16    }
17}
18
19struct TSIDDatabaseIDVisitor<Resource: TSIDResource> {
20    resource: PhantomData<Resource>,
21}
22
23impl<'de, Resource: TSIDResource> Visitor<'de> for TSIDDatabaseIDVisitor<Resource> {
24    type Value = TSIDDatabaseID<Resource>;
25    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
26        write!(
27            formatter,
28            "string TSID prefixed with {}_",
29            Resource::prefix().unwrap_or("nothing".to_owned())
30        )
31    }
32
33    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
34    where
35        E: serde::de::Error,
36    {
37        TSIDDatabaseID::<Resource>::from_str(v)
38            .map_err(|e| E::invalid_value(Unexpected::Str(&e.to_string()), &self))
39    }
40}
41
42impl<'de, Resource: TSIDResource> Deserialize<'de> for TSIDDatabaseID<Resource> {
43    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
44    where
45        D: serde::Deserializer<'de>,
46    {
47        let visitor = TSIDDatabaseIDVisitor::<Resource> {
48            resource: PhantomData,
49        };
50        deserializer.deserialize_string(visitor)
51    }
52}