nuscenes_data/serializable/
token.rs1use crate::error::Error;
2use serde::{de::Error as _, Deserialize, Deserializer, Serialize, Serializer};
3use std::{
4 convert::TryFrom,
5 fmt::{self, Display, Formatter},
6 str::FromStr,
7};
8
9pub const TOKEN_LENGTH: usize = 16;
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
12pub struct Token(pub [u8; TOKEN_LENGTH]);
13
14impl Display for Token {
15 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
16 let Token(bytes) = self;
17 let text = hex::encode(bytes);
18 write!(formatter, "{}", text)
19 }
20}
21
22impl FromStr for Token {
23 type Err = Error;
24
25 fn from_str(text: &str) -> Result<Self, Self::Err> {
26 let bytes = hex::decode(text)
27 .map_err(|err| Error::ParseError(format!("cannot decode token: {:?}", err)))?;
28 if bytes.len() != TOKEN_LENGTH {
29 let msg = format!(
30 "invalid length: expected length {}, but found {}",
31 TOKEN_LENGTH * 2,
32 text.len()
33 );
34 return Err(Error::ParseError(msg));
35 }
36 let array = <[u8; TOKEN_LENGTH]>::try_from(bytes.as_slice()).unwrap();
37 Ok(Token(array))
38 }
39}
40
41impl Serialize for Token {
42 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
43 where
44 S: Serializer,
45 {
46 self.to_string().serialize(serializer)
47 }
48}
49
50impl<'de> Deserialize<'de> for Token {
51 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
52 where
53 D: Deserializer<'de>,
54 {
55 let text = String::deserialize(deserializer)?;
56 let token: Self = text
57 .parse()
58 .map_err(|err| D::Error::custom(format!("{err}")))?;
59 Ok(token)
60 }
61}
62
63#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
64pub struct VisibilityToken(pub u32);
65
66impl Display for VisibilityToken {
67 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
68 write!(formatter, "{}", self.0)
69 }
70}
71
72impl Serialize for VisibilityToken {
73 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
74 where
75 S: Serializer,
76 {
77 self.0.to_string().serialize(serializer)
78 }
79}
80
81impl<'de> Deserialize<'de> for VisibilityToken {
82 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
83 where
84 D: Deserializer<'de>,
85 {
86 let token = String::deserialize(deserializer)?;
87 let token: u32 = token.parse().map_err(|err| {
88 D::Error::custom(format!("invalid visibility token \"{token}\": {err}"))
89 })?;
90 Ok(Self(token))
91 }
92}