use std::{fmt, sync::Arc, time::Duration};
use crate::transport::meta::ResponseMeta;
pub trait TransportObserver: Send + Sync {
fn on_response(&self, meta: &ObservedResponseMeta);
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ObservedResponseMeta {
pub endpoint_name: &'static str,
pub url: String,
pub status: u16,
pub request_id: Option<String>,
pub attempt_count: u32,
pub elapsed: Duration,
}
impl From<&ResponseMeta> for ObservedResponseMeta {
fn from(meta: &ResponseMeta) -> Self {
Self {
endpoint_name: meta.endpoint_name,
url: meta.url.clone(),
status: meta.status,
request_id: meta.request_id.clone(),
attempt_count: meta.attempt_count,
elapsed: meta.elapsed,
}
}
}
#[derive(Clone)]
pub(crate) struct ObserverHandle {
observer: Arc<dyn TransportObserver>,
}
impl ObserverHandle {
pub(crate) fn new(observer: Arc<dyn TransportObserver>) -> Self {
Self { observer }
}
pub(crate) fn on_response(&self, meta: &ResponseMeta) {
let observed = ObservedResponseMeta::from(meta);
self.observer.on_response(&observed);
}
}
impl fmt::Debug for ObserverHandle {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("ObserverHandle(..)")
}
}