xray_lite/
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(&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}