#![allow(dead_code)]
use std::sync::{Arc, Mutex};
use tracing::Dispatch;
use tracing_subscriber::{layer::SubscriberExt, Registry};
pub fn capture_output<F>(f: F) -> String
where
F: FnOnce(),
{
let buf = Arc::new(Mutex::new(Vec::new()));
let buf_clone = Arc::clone(&buf);
let layer = tracing_subscriber::fmt::layer()
.with_target(false)
.with_ansi(false)
.with_writer(move || TestWriter(Arc::clone(&buf_clone)));
let subscriber = Registry::default().with(layer);
let dispatch = Dispatch::new(subscriber);
tracing::dispatcher::with_default(&dispatch, f);
let bytes = buf.lock().expect("poisoned").clone();
String::from_utf8(bytes).expect("invalid utf8")
}
struct TestWriter(Arc<Mutex<Vec<u8>>>);
impl std::io::Write for TestWriter {
fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
self.0.lock().expect("poisoned").extend_from_slice(buf);
Ok(buf.len())
}
fn flush(&mut self) -> std::io::Result<()> {
Ok(())
}
}
pub static INIT_LOCK: Mutex<()> = Mutex::new(());