Skip to main content

nominal_streaming/
listener.rs

1use std::error::Error;
2use std::fmt::Debug;
3use std::panic::RefUnwindSafe;
4use std::sync::Arc;
5
6use nominal_api::tonic::io::nominal::scout::api::proto::WriteRequestNominal;
7use tracing::error;
8
9pub trait NominalStreamListener: Send + Sync + Debug + RefUnwindSafe {
10    fn on_error(&self, error: &dyn Error, request: &WriteRequestNominal);
11
12    fn on_success(&self, _request: &WriteRequestNominal) {}
13}
14
15impl NominalStreamListener for Vec<Arc<dyn NominalStreamListener>> {
16    fn on_error(&self, error: &dyn Error, request: &WriteRequestNominal) {
17        for listener in self {
18            listener.on_error(error, request);
19        }
20    }
21
22    fn on_success(&self, request: &WriteRequestNominal) {
23        for listener in self {
24            listener.on_success(request);
25        }
26    }
27}
28
29#[derive(Debug, Default, Clone)]
30pub struct LoggingListener;
31
32impl NominalStreamListener for LoggingListener {
33    fn on_error(&self, error: &dyn Error, request: &WriteRequestNominal) {
34        let len = request.series.len();
35        let message = format!("Failed to consume request with {len} series");
36        error!("{message}: {error}");
37    }
38}