1use crate::hexbytes::Bytes;
2use rand::RngCore;
3use serde::{de, ser, Serializer};
4use std::fmt;
5
6#[derive(Debug, PartialEq, Clone)]
8pub enum SegmentId {
9 #[doc(hidden)]
10 New([u8; 8]),
11 #[doc(hidden)]
12 Rendered(String),
13}
14
15impl SegmentId {
16 pub fn new() -> Self {
18 let mut buf = [0; 8];
19 rand::thread_rng().fill_bytes(&mut buf);
20 SegmentId::New(buf)
21 }
22}
23
24impl fmt::Display for SegmentId {
25 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
26 match self {
27 SegmentId::New(bytes) => write!(f, "{:x}", Bytes(bytes)),
28 SegmentId::Rendered(value) => write!(f, "{}", value),
29 }
30 }
31}
32
33impl Default for SegmentId {
34 fn default() -> Self {
35 SegmentId::new()
36 }
37}
38
39struct SegmentIdVisitor;
40
41impl<'de> de::Visitor<'de> for SegmentIdVisitor {
42 type Value = SegmentId;
43
44 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
45 formatter.write_str("a string value")
46 }
47 fn visit_str<E>(self, value: &str) -> Result<SegmentId, E>
48 where
49 E: de::Error,
50 {
51 Ok(SegmentId::Rendered(value.into()))
52 }
53}
54
55impl ser::Serialize for SegmentId {
56 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
57 where
58 S: Serializer,
59 {
60 serializer.serialize_str(&format!("{}", self))
61 }
62}
63
64impl<'de> de::Deserialize<'de> for SegmentId {
65 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
66 where
67 D: de::Deserializer<'de>,
68 {
69 deserializer.deserialize_str(SegmentIdVisitor)
70 }
71}