#![doc(html_root_url = "https://docs.rs/zipkin-types/0.1")]
#![warn(missing_docs)]
#[doc(inline)]
pub use crate::annotation::Annotation;
#[doc(inline)]
pub use crate::endpoint::Endpoint;
#[doc(inline)]
pub use crate::span::{Kind, Span};
#[doc(inline)]
pub use crate::span_id::SpanId;
#[doc(inline)]
pub use crate::trace_id::TraceId;
pub mod annotation;
pub mod endpoint;
pub mod span;
pub mod span_id;
pub mod trace_id;
#[cfg(feature = "serde")]
mod time_micros {
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::time::{Duration, SystemTime, UNIX_EPOCH};
pub fn to_wire(time: &SystemTime) -> u64 {
super::duration_micros::to_wire(
&time
.duration_since(UNIX_EPOCH)
.unwrap_or(Duration::from_secs(0)),
)
}
pub fn from_wire(time: u64) -> SystemTime {
let duration = super::duration_micros::from_wire(time);
UNIX_EPOCH + duration
}
pub fn serialize<S>(time: &SystemTime, s: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
to_wire(time).serialize(s)
}
pub fn deserialize<'de, D>(d: D) -> Result<SystemTime, D::Error>
where
D: Deserializer<'de>,
{
u64::deserialize(d).map(from_wire)
}
}
#[cfg(feature = "serde")]
mod duration_micros {
use std::time::Duration;
pub fn to_wire(duration: &Duration) -> u64 {
let micros = duration.as_secs() * 1_000_000 + duration.subsec_nanos() as u64 / 1_000;
micros.max(1)
}
pub fn from_wire(duration: u64) -> Duration {
let seconds = duration / 1_000_000;
let subsec_nanos = (duration % 1_000_000) * 1_000;
Duration::new(seconds, subsec_nanos as u32)
}
}
#[cfg(feature = "serde")]
mod opt_time_micros {
use serde::{Deserialize, Deserializer, Serializer};
use std::time::SystemTime;
pub fn serialize<S>(time: &Option<SystemTime>, s: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match *time {
Some(ref time) => s.serialize_some(&super::time_micros::to_wire(time)),
None => s.serialize_none(),
}
}
pub fn deserialize<'de, D>(d: D) -> Result<Option<SystemTime>, D::Error>
where
D: Deserializer<'de>,
{
Option::<u64>::deserialize(d).map(|o| o.map(super::time_micros::from_wire))
}
}
#[cfg(feature = "serde")]
mod opt_duration_micros {
use serde::{Deserialize, Deserializer, Serializer};
use std::time::Duration;
pub fn serialize<S>(duration: &Option<Duration>, s: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match *duration {
Some(ref duration) => s.serialize_some(&super::duration_micros::to_wire(duration)),
None => s.serialize_none(),
}
}
pub fn deserialize<'de, D>(d: D) -> Result<Option<Duration>, D::Error>
where
D: Deserializer<'de>,
{
Option::<u64>::deserialize(d).map(|o| o.map(super::duration_micros::from_wire))
}
}