use std::future::Future;
use std::pin::Pin;
pub trait TelemetryProvider: Send + Sync + 'static {
fn init(&self, service_name: &str) -> crate::error::Result<()>;
fn on_shutdown(&self) -> Pin<Box<dyn Future<Output = ()> + Send>> {
Box::pin(async {})
}
}
pub struct BasicTelemetryProvider;
impl TelemetryProvider for BasicTelemetryProvider {
fn init(&self, _service_name: &str) -> crate::error::Result<()> {
crate::adapters::observability::telemetry::init_basic_tracing();
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
struct NoopProvider;
impl TelemetryProvider for NoopProvider {
fn init(&self, _: &str) -> crate::error::Result<()> {
Ok(())
}
}
#[tokio::test]
async fn basic_provider_init_is_idempotent() {
let p = BasicTelemetryProvider;
assert!(p.init("svc").is_ok());
assert!(p.init("svc").is_ok());
}
#[tokio::test]
async fn default_on_shutdown_completes() {
let p = NoopProvider;
p.on_shutdown().await; }
#[tokio::test]
async fn basic_provider_on_shutdown_is_noop() {
let p = BasicTelemetryProvider;
p.on_shutdown().await;
}
}