v0.1.3-pre.005
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-logging-lib/src/writer.rs
|
||||
// version: 1
|
||||
// version: 2
|
||||
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
enum StripAnsiState {
|
||||
@@ -100,6 +100,96 @@ impl<W> StripAnsiWriter<W> {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub(crate) struct RouteMakeWriter<W> {
|
||||
inner: W,
|
||||
filter: crate::OutputFilter,
|
||||
}
|
||||
|
||||
impl<W> RouteMakeWriter<W> {
|
||||
pub(crate) fn new(inner: W, filter: crate::OutputFilter) -> Self {
|
||||
return Self { inner, filter };
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) enum RoutedWriter<W> {
|
||||
Enabled(W),
|
||||
Disabled,
|
||||
}
|
||||
|
||||
impl<W> std::io::Write for RoutedWriter<W>
|
||||
where
|
||||
W: std::io::Write,
|
||||
{
|
||||
fn write(&mut self, buffer: &[u8]) -> std::io::Result<usize> {
|
||||
return match self {
|
||||
Self::Enabled(writer) => std::io::Write::write(writer, buffer),
|
||||
Self::Disabled => std::result::Result::Ok(buffer.len()),
|
||||
};
|
||||
}
|
||||
|
||||
fn flush(&mut self) -> std::io::Result<()> {
|
||||
return match self {
|
||||
Self::Enabled(writer) => std::io::Write::flush(writer),
|
||||
Self::Disabled => std::result::Result::Ok(()),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
impl<'writer, W> tracing_subscriber::fmt::MakeWriter<'writer> for RouteMakeWriter<W>
|
||||
where
|
||||
W: tracing_subscriber::fmt::MakeWriter<'writer>,
|
||||
{
|
||||
type Writer = RoutedWriter<W::Writer>;
|
||||
|
||||
fn make_writer(&'writer self) -> Self::Writer {
|
||||
return RoutedWriter::Enabled(tracing_subscriber::fmt::MakeWriter::make_writer(&self.inner));
|
||||
}
|
||||
|
||||
fn make_writer_for(&'writer self, metadata: &tracing::Metadata<'_>) -> Self::Writer {
|
||||
if metadata_matches_filter(metadata, &self.filter) {
|
||||
return RoutedWriter::Enabled(tracing_subscriber::fmt::MakeWriter::make_writer_for(&self.inner, metadata));
|
||||
}
|
||||
return RoutedWriter::Disabled;
|
||||
}
|
||||
}
|
||||
|
||||
fn metadata_matches_filter(metadata: &tracing::Metadata<'_>, filter: &crate::OutputFilter) -> bool {
|
||||
if !level_is_enabled(metadata.level(), filter.level()) {
|
||||
return false;
|
||||
}
|
||||
return filter.targets().iter().any(|selector| -> bool {
|
||||
return selector == "*" || metadata.target().starts_with(selector.as_str());
|
||||
});
|
||||
}
|
||||
|
||||
fn level_is_enabled(level: &tracing::Level, filter: crate::LogFilterLevel) -> bool {
|
||||
return match filter {
|
||||
crate::LogFilterLevel::Off => false,
|
||||
crate::LogFilterLevel::Error => level_rank(level) <= 1,
|
||||
crate::LogFilterLevel::Warn => level_rank(level) <= 2,
|
||||
crate::LogFilterLevel::Info => level_rank(level) <= 3,
|
||||
crate::LogFilterLevel::Debug => level_rank(level) <= 4,
|
||||
crate::LogFilterLevel::Trace => level_rank(level) <= 5,
|
||||
};
|
||||
}
|
||||
|
||||
fn level_rank(level: &tracing::Level) -> u8 {
|
||||
if level == &tracing::Level::ERROR {
|
||||
return 1;
|
||||
}
|
||||
if level == &tracing::Level::WARN {
|
||||
return 2;
|
||||
}
|
||||
if level == &tracing::Level::INFO {
|
||||
return 3;
|
||||
}
|
||||
if level == &tracing::Level::DEBUG {
|
||||
return 4;
|
||||
}
|
||||
return 5;
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "../unit_tests/writer.rs"]
|
||||
mod tests;
|
||||
|
||||
Reference in New Issue
Block a user