#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::borrow::Cow;
#[cfg(feature = "std")]
use std::borrow::Cow;
#[cfg(any(feature = "std", feature = "alloc"))]
pub trait HeaderId {
const HEADER_NAME: &'static str;
fn as_str(&self) -> Cow<'_, str>;
}
#[cfg(all(test, feature = "uuid"))]
mod tests {
use super::*;
use crate::correlation_id::CorrelationId;
use crate::idempotency::IdempotencyKey;
use crate::request_id::RequestId;
use crate::traceparent::TraceContext;
#[test]
fn header_names() {
assert_eq!(RequestId::HEADER_NAME, "X-Request-Id");
assert_eq!(CorrelationId::HEADER_NAME, "X-Correlation-Id");
assert_eq!(IdempotencyKey::HEADER_NAME, "Idempotency-Key");
assert_eq!(TraceContext::HEADER_NAME, "traceparent");
}
fn trait_as_str<T: HeaderId>(v: &T) -> Cow<'_, str> {
v.as_str()
}
#[test]
fn as_str_request_id() {
let id = RequestId::from_uuid(uuid::Uuid::nil());
assert_eq!(trait_as_str(&id), "00000000-0000-0000-0000-000000000000");
}
#[test]
fn as_str_correlation_id() {
let id = CorrelationId::new("corr-abc").unwrap();
assert_eq!(trait_as_str(&id), "corr-abc");
}
#[test]
fn as_str_idempotency_key() {
let key = IdempotencyKey::new("my-key").unwrap();
assert_eq!(trait_as_str(&key), "my-key");
}
#[test]
fn as_str_trace_context() {
let tc: TraceContext = "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
.parse()
.unwrap();
assert_eq!(
trait_as_str(&tc),
"00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
);
}
#[test]
fn header_name_instance_methods() {
let key = IdempotencyKey::new("x").unwrap();
assert_eq!(key.header_name(), "Idempotency-Key");
let tc = TraceContext::new();
assert_eq!(tc.header_name(), "traceparent");
}
#[test]
fn generic_header_name_fn() {
fn header_name_of<T: HeaderId>() -> &'static str {
T::HEADER_NAME
}
assert_eq!(header_name_of::<RequestId>(), "X-Request-Id");
assert_eq!(header_name_of::<CorrelationId>(), "X-Correlation-Id");
assert_eq!(header_name_of::<IdempotencyKey>(), "Idempotency-Key");
assert_eq!(header_name_of::<TraceContext>(), "traceparent");
}
}