v0.1.3-pre.005

This commit is contained in:
2026-08-15 20:22:02 +02:00
parent 29660fd9f0
commit 063b24ee1c
17 changed files with 957 additions and 244 deletions

View File

@@ -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;