nominal_streaming/
listener.rs1use 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}