use crate::commands::{
ArrayCommands, ClusterCommands, GenericCommands, JsonCommands, SearchCommands,
SentinelCommands, ServerCommands, SortedSetCommands, StreamCommands, StringCommands,
VectorSetCommands,
};
use std::sync::{
Mutex, OnceLock,
atomic::{AtomicBool, Ordering},
};
pub(crate) fn log_try_init() {
static INIT: OnceLock<()> = OnceLock::new();
INIT.get_or_init(|| {
let inner = env_logger::builder()
.format_target(false)
.format_timestamp(None)
.filter_level(log::LevelFilter::Debug)
.target(env_logger::Target::Stdout)
.is_test(true)
.parse_default_env()
.build();
log::set_max_level(inner.filter());
let _ = log::set_boxed_logger(Box::new(TeeLogger { inner }));
});
}
pub(crate) struct TestClient;
impl<'a> ArrayCommands<'a> for TestClient {}
impl<'a> StreamCommands<'a> for TestClient {}
impl<'a> VectorSetCommands<'a> for TestClient {}
impl<'a> ClusterCommands<'a> for TestClient {}
impl<'a> GenericCommands<'a> for TestClient {}
impl<'a> JsonCommands<'a> for TestClient {}
impl<'a> SearchCommands<'a> for TestClient {}
impl<'a> SentinelCommands<'a> for TestClient {}
impl<'a> ServerCommands<'a> for TestClient {}
impl<'a> SortedSetCommands<'a> for TestClient {}
impl<'a> StringCommands<'a> for TestClient {}
pub(crate) static RECORDED: Mutex<Vec<(log::Level, String)>> = Mutex::new(Vec::new());
pub(crate) static RECORDING: AtomicBool = AtomicBool::new(false);
struct TeeLogger {
inner: env_logger::Logger,
}
impl log::Log for TeeLogger {
fn enabled(&self, metadata: &log::Metadata<'_>) -> bool {
self.inner.enabled(metadata)
}
fn log(&self, record: &log::Record<'_>) {
if RECORDING.load(Ordering::SeqCst) && record.target().starts_with("rustis") {
RECORDED
.lock()
.unwrap()
.push((record.level(), record.args().to_string()));
}
self.inner.log(record);
}
fn flush(&self) {
self.inner.flush();
}
}