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}