tracing_core_x/
lib.rs

1#![cfg_attr(nightly, feature(doc_auto_cfg))]
2
3use serde::{Deserialize, Serialize};
4use std::num::NonZeroU64;
5use tracing_core::span::Id;
6
7/// [Id](https://docs.rs/tracing-core/latest/tracing_core/span/struct.Id.html) with: Serialize + Deserialize + Copy
8#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Eq, Hash)]
9pub struct IdX(NonZeroU64);
10
11impl From<Id> for IdX {
12    fn from(value: Id) -> Self {
13        Self(value.into_non_zero_u64())
14    }
15}
16
17impl From<&Id> for IdX {
18    fn from(value: &Id) -> Self {
19        Self(value.into_non_zero_u64())
20    }
21}
22
23impl From<IdX> for Id {
24    fn from(value: IdX) -> Self {
25        Self::from_non_zero_u64(value.0)
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    fn gen_id() -> Id {
34        Id::from_non_zero_u64(rand::random())
35    }
36
37    #[tokio::test(flavor = "multi_thread")]
38    async fn idx() {
39        let id = gen_id();
40        let idx: IdX = (&id).into();
41        let de: IdX = serde_json::from_str(
42            &tokio::spawn(async move { serde_json::to_string(&idx).unwrap() })
43                .await
44                .unwrap(),
45        )
46        .unwrap();
47
48        assert_eq!(id, de.into());
49    }
50}