use effect_rs::{Effect, Runtime};
use std::sync::{Arc, Mutex};
use tracing::Subscriber;
use tracing_subscriber::layer::Context;
use tracing_subscriber::prelude::*;
use tracing_subscriber::{Layer, Registry};
#[derive(Clone)]
struct MockLayer {
spans: Arc<Mutex<Vec<String>>>,
}
impl<S: Subscriber> Layer<S> for MockLayer {
fn on_new_span(
&self,
attrs: &tracing::span::Attributes<'_>,
_id: &tracing::Id,
_ctx: Context<'_, S>,
) {
let name = attrs.metadata().name();
self.spans.lock().unwrap().push(name.to_string());
}
}
#[test]
fn test_trace_combinator() {
let spans = Arc::new(Mutex::new(Vec::new()));
let layer = MockLayer {
spans: spans.clone(),
};
let subscriber = Registry::default().with(layer);
tracing::subscriber::with_default(subscriber, || {
let rt = Runtime::new();
let program: Effect<(), (), &str> = Effect::succeed("test").trace("my_span");
let _ = rt.block_on(program, ());
});
let collected = spans.lock().unwrap();
assert!(collected.contains(&"effect".to_string()));
assert!(collected.contains(&"runtime_execution".to_string()));
}