1use hex::FromHexError;
2use serde::{de::Error as _, Deserialize, Deserializer, Serialize, Serializer};
3use std::str::FromStr;
4
5define_byte_array_wrapper! {
6    pub struct DeviceId([u8; 32]);
17}
18
19derive_rand_for_wrapper!(DeviceId);
20derive_sqlx_traits_for_byte_array_wrapper!(DeviceId);
21
22impl FromStr for DeviceId {
23    type Err = FromHexError;
24
25    fn from_str(s: &str) -> Result<Self, Self::Err> {
26        let mut buffer = [0; Self::SIZE];
27        hex::decode_to_slice(s.trim(), &mut buffer)?;
28        Ok(Self(buffer))
29    }
30}
31
32impl Serialize for DeviceId {
33    fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
34    where
35        S: Serializer,
36    {
37        if s.is_human_readable() {
38            self.to_string().serialize(s)
39        } else {
40            self.0.serialize(s)
41        }
42    }
43}
44
45impl<'de> Deserialize<'de> for DeviceId {
46    fn deserialize<D>(d: D) -> Result<Self, D::Error>
47    where
48        D: Deserializer<'de>,
49    {
50        if d.is_human_readable() {
51            <&str>::deserialize(d)?.parse().map_err(D::Error::custom)
52        } else {
53            <[u8; Self::SIZE]>::deserialize(d).map(Self)
54        }
55    }
56}