drasi_core/interface/
source_middleware.rs1use std::sync::Arc;
16
17use async_trait::async_trait;
18use thiserror::Error;
19
20use crate::models::{SourceChange, SourceMiddlewareConfig};
21
22use super::{ElementIndex, IndexError};
23
24#[derive(Error, Debug)]
25pub enum MiddlewareError {
26 #[error("Error processing source change: {0}")]
27 SourceChangeError(String),
28
29 #[error("Unknown middleware {0}")]
30 UnknownKind(String),
31
32 #[error("Error processing source change: {0}")]
33 IndexError(IndexError),
34}
35
36impl From<IndexError> for MiddlewareError {
37 fn from(val: IndexError) -> Self {
38 MiddlewareError::IndexError(val)
39 }
40}
41
42#[derive(Error, Debug)]
43pub enum MiddlewareSetupError {
44 #[error("Invalid configuration: {0}")]
45 InvalidConfiguration(String),
46 #[error("No registry found for middleware")]
47 NoRegistry,
48}
49
50#[async_trait]
51pub trait SourceMiddleware: Send + Sync {
52 async fn process(
53 &self,
54 source_change: SourceChange,
55 element_index: &dyn ElementIndex,
56 ) -> Result<Vec<SourceChange>, MiddlewareError>;
57}
58
59pub trait SourceMiddlewareFactory: Send + Sync {
60 fn name(&self) -> String;
61 fn create(
62 &self,
63 config: &SourceMiddlewareConfig,
64 ) -> Result<Arc<dyn SourceMiddleware>, MiddlewareSetupError>;
65 }