From d22e5659fce5b35d7f8ec1e2da8aab73f3bf3073 Mon Sep 17 00:00:00 2001 From: Ondrej Novak Date: Thu, 25 Jun 2026 22:51:40 +0200 Subject: [PATCH] fail if no metric is found for a series --- waybar-collectd/src/err.rs | 22 ++++++++++++++++++++++ waybar-collectd/src/main.rs | 1 + waybar-collectd/src/observables.rs | 22 ++++++++++++++-------- waybar-collectd/src/runner.rs | 5 +++-- 4 files changed, 40 insertions(+), 10 deletions(-) create mode 100644 waybar-collectd/src/err.rs diff --git a/waybar-collectd/src/err.rs b/waybar-collectd/src/err.rs new file mode 100644 index 0000000..3428f30 --- /dev/null +++ b/waybar-collectd/src/err.rs @@ -0,0 +1,22 @@ +use std::fmt; + +use protocol::ProtocolError; + +#[derive(PartialEq, Debug)] +pub enum WaybarCollectdError { + ProtocolError(ProtocolError), + NoMatchingMetricFound(String), +} + +impl fmt::Display for WaybarCollectdError { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let message = match self { + Self::ProtocolError(val) => format!("Collectd integration failed: {val}"), + Self::NoMatchingMetricFound(name) => { + format!("No matching metric found for {}", name) + } + }; + + f.write_str(&message) + } +} diff --git a/waybar-collectd/src/main.rs b/waybar-collectd/src/main.rs index 66db3b5..81c226d 100644 --- a/waybar-collectd/src/main.rs +++ b/waybar-collectd/src/main.rs @@ -1,4 +1,5 @@ mod config; +mod err; mod observables; mod runner; diff --git a/waybar-collectd/src/observables.rs b/waybar-collectd/src/observables.rs index 9cd161c..7e0154b 100644 --- a/waybar-collectd/src/observables.rs +++ b/waybar-collectd/src/observables.rs @@ -1,7 +1,7 @@ use protocol::{Protocol, ProtocolError}; use regex::Regex; -use crate::config::MetricSpecification; +use crate::{config::MetricSpecification, err::WaybarCollectdError}; pub struct Observable { pub name: String, @@ -23,8 +23,10 @@ impl Observable { proto: &mut Protocol, name: &str, includes: &Vec, - ) -> Result { - let all_values = proto.list()?; + ) -> Result { + let all_values = proto + .list() + .map_err(|e| WaybarCollectdError::ProtocolError(e))?; let regexes: Vec = includes .iter() .map(|i| MetricRegex { @@ -32,7 +34,7 @@ impl Observable { value: i.value.to_string(), }) .collect(); - let filtered_values = all_values + let filtered_values: Vec = all_values .into_iter() .filter_map(|v| { for r in regexes.iter() { @@ -48,10 +50,14 @@ impl Observable { }) .collect(); - Ok(Observable { - name: name.to_string(), - metrics: filtered_values, - }) + if filtered_values.len() == 0 { + Err(WaybarCollectdError::NoMatchingMetricFound(name.to_string())) + } else { + Ok(Observable { + name: name.to_string(), + metrics: filtered_values, + }) + } } pub fn sample(&self, proto: &mut Protocol) -> Result { diff --git a/waybar-collectd/src/runner.rs b/waybar-collectd/src/runner.rs index 51fdfd0..024a431 100644 --- a/waybar-collectd/src/runner.rs +++ b/waybar-collectd/src/runner.rs @@ -1,10 +1,11 @@ use core::fmt; use draw::{StackedConfig, StackedSeries, StackedSeriesConfig, stacked}; -use protocol::{Protocol, ProtocolError}; +use protocol::Protocol; use crate::{ config::GraphConfig, + err::WaybarCollectdError, observables::{Observable, ObservableCollection}, }; @@ -33,7 +34,7 @@ impl Graph { .series .iter() .map(|s| Observable::discover(proto, &s.name, &s.metrics)) - .collect::, ProtocolError>>() + .collect::, WaybarCollectdError>>() .expect("Could not discover required metrics"), );