1#![cfg_attr(nightly, feature(doc_auto_cfg))]
2
3use serde::{Deserialize, Serialize};
4use std::num::NonZeroU64;
5use tracing_core::span::Id;
6
7#[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}