use crate::datastore::config::DatastoreConfig;
use crate::datastore::generic_log::GenericLog;
use crate::datastore::transmitter::DatastoreTransmitter;
use chrono::Utc;
use tokio::sync::mpsc;
use tokio::sync::mpsc::Sender;
#[derive(Default)]
pub(crate) struct DatastoreLogger {
logger: Option<Sender<GenericLog>>,
}
impl DatastoreLogger {
pub(crate) fn new(datastore_config: Option<DatastoreConfig>) -> Self {
let Some(config) = datastore_config else {
return Self::default();
};
let (sender, receiver) = mpsc::channel(10_000);
tokio::spawn(async move {
let transmitter = DatastoreTransmitter::new(config).await;
transmitter.transmit(receiver).await;
});
Self {
logger: Some(sender),
}
}
}
impl log::Log for DatastoreLogger {
fn enabled(&self, metadata: &log::Metadata) -> bool {
self.logger.as_ref().is_some_and(|_| {
metadata.level() <= log::max_level()
&& !metadata.target().starts_with("nullnet_libdatastore")
&& !metadata.target().starts_with("nullnet_libtoken")
})
}
fn log(&self, record: &log::Record) {
if let Some(logger) = self.logger.as_ref() {
if self.enabled(record.metadata()) {
let timestamp = Utc::now().to_rfc3339();
let level = record.level().to_string();
let message = record.args().to_string();
let e = GenericLog {
timestamp,
level,
message,
};
let _ = logger.try_send(e);
}
}
}
fn flush(&self) {}
}