xray_tracing/
segment_id.rs1use 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(
26 &self,
27 f: &mut fmt::Formatter<'_>,
28 ) -> fmt::Result {
29 match self {
30 SegmentId::New(bytes) => write!(f, "{:x}", Bytes(bytes)),
31 SegmentId::Rendered(value) => write!(f, "{}", value),
32 }
33 }
34}
35
36impl Default for SegmentId {
37 fn default() -> Self {
38 SegmentId::new()
39 }
40}
41
42struct SegmentIdVisitor;
43
44impl<'de> de::Visitor<'de> for SegmentIdVisitor {
45 type Value = SegmentId;
46
47 fn expecting(
48 &self,
49 formatter: &mut fmt::Formatter,
50 ) -> fmt::Result {
51 formatter.write_str("a string value")
52 }
53 fn visit_str<E>(
54 self,
55 value: &str,
56 ) -> Result<SegmentId, E>
57 where
58 E: de::Error,
59 {
60 Ok(SegmentId::Rendered(value.into()))
61 }
62}
63
64impl ser::Serialize for SegmentId {
65 fn serialize<S>(
66 &self,
67 serializer: S,
68 ) -> Result<S::Ok, S::Error>
69 where
70 S: Serializer,
71 {
72 serializer.serialize_str(&format!("{}", self))
73 }
74}
75
76impl<'de> de::Deserialize<'de> for SegmentId {
77 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
78 where
79 D: de::Deserializer<'de>,
80 {
81 deserializer.deserialize_str(SegmentIdVisitor)
82 }
83}