use arrow::array::StringArray;
use re_lenses::{Lens, LensError, op};
use re_lenses_core::Selector;
use re_lenses_core::combinators::{MapList, Transform};
use re_log_types::{EntityPathFilter, TimeType};
use re_sdk_types::archetypes::TextLog;
use super::FOXGLOVE_TIMESTAMP;
pub fn log(time_type: TimeType) -> Result<Lens, LensError> {
Ok(
Lens::for_input_column(EntityPathFilter::all(), "foxglove.Log:message")
.output_columns(|out| {
out.time(
FOXGLOVE_TIMESTAMP,
time_type,
Selector::parse(".timestamp")?.then(MapList::new(op::timespec_to_nanos())),
)?
.component(TextLog::descriptor_text(), Selector::parse(".message")?)?
.component(
TextLog::descriptor_level(),
Selector::parse(".level.name")?.then(MapList::new(FoxgloveToRerunLogLevel)),
)
})?
.build(),
)
}
struct FoxgloveToRerunLogLevel;
impl Transform for FoxgloveToRerunLogLevel {
type Source = StringArray;
type Target = StringArray;
fn transform(
&self,
source: &StringArray,
) -> Result<Option<StringArray>, re_lenses_core::combinators::Error> {
Ok(Some(
source
.iter()
.map(|level| match level {
Some("WARNING") => Some("WARN"),
Some("FATAL") => Some("CRITICAL"),
Some("UNKNOWN") | None => None,
other => other,
})
.collect(),
))
}
}