xray_tracing/
segment_id.rs

1use crate::hexbytes::Bytes;
2use rand::RngCore;
3use serde::{de, ser, Serializer};
4use std::fmt;
5
6/// Unique identifier of an operation within a trace
7#[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    /// Generate a new random segment ID
17    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}