blob: 040486a2eac59d2b6382e668782aaf0ab71a1c65 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
use fidl_fuchsia_logger::{LogListenerProxy, LogMessage};
use std::collections::HashSet;
pub(super) struct ListenerWrapper {
pub listener: LogListenerProxy,
pub min_severity: Option<i32>,
pub pid: Option<u64>,
pub tid: Option<u64>,
pub tags: HashSet<String>,
}
#[derive(PartialEq)]
pub(super) enum ListenerStatus {
Fine,
Stale,
}
impl ListenerWrapper {
pub fn filter(&self, log_message: &mut LogMessage) -> bool {
if self.pid.map(|pid| pid != log_message.pid).unwrap_or(false)
|| self.tid.map(|tid| tid != log_message.tid).unwrap_or(false)
|| self.min_severity.map(|min_sev| min_sev > log_message.severity).unwrap_or(false)
{
return false;
}
if !self.tags.is_empty() {
if !log_message.tags.iter().any(|tag| self.tags.contains(tag)) {
return false;
}
}
return true;
}
/// This fn assumes that logs have already been filtered.
pub fn send_filtered_logs(&self, log_messages: &mut Vec<LogMessage>) -> ListenerStatus {
let res = self.listener.log_many(&mut log_messages.iter_mut());
if let Err(e) = res {
if e.is_closed() {
ListenerStatus::Stale
} else {
eprintln!("Error calling listener: {:?}", e);
ListenerStatus::Fine
}
} else {
ListenerStatus::Fine
}
}
pub fn send_log(&self, log_message: &mut LogMessage) -> ListenerStatus {
if !self.filter(log_message) {
return ListenerStatus::Fine;
}
if let Err(e) = self.listener.log(log_message) {
if e.is_closed() {
ListenerStatus::Stale
} else {
eprintln!("Error calling listener: {:?}", e);
ListenerStatus::Fine
}
} else {
ListenerStatus::Fine
}
}
}