use crate::format::{ParseError, Splitter};
use feldera_types::preprocess::PreprocessorConfig;
use std::collections::BTreeMap;
use std::fmt::{Display, Formatter, Result as FmtResult};
use std::sync::Arc;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PreprocessorCreateError {
ConfigurationError(String),
FactoryNotFound(String),
}
impl Display for PreprocessorCreateError {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
match self {
PreprocessorCreateError::ConfigurationError(msg) => {
write!(f, "Configuration error: {}", msg)
}
PreprocessorCreateError::FactoryNotFound(msg) => {
write!(
f,
"Could not locate factory generating preprocessor: {}",
msg
)
}
}
}
}
impl std::error::Error for PreprocessorCreateError {}
pub trait Preprocessor: Send + Sync {
fn process(&mut self, data: &[u8]) -> (Vec<u8>, Vec<ParseError>);
fn fork(&self) -> Box<dyn Preprocessor>;
fn splitter(&self) -> Option<Box<dyn Splitter>>;
}
pub trait PreprocessorFactory: Send + Sync {
fn create(
&self,
config: &PreprocessorConfig,
) -> Result<Box<dyn Preprocessor>, PreprocessorCreateError>;
}
#[derive(Default)]
pub struct PreprocessorRegistry {
registered: BTreeMap<&'static str, Arc<dyn PreprocessorFactory>>,
}
impl PreprocessorRegistry {
pub fn new() -> Self {
Self {
registered: BTreeMap::new(),
}
}
pub fn register(&mut self, name: &'static str, factory: Box<dyn PreprocessorFactory>) {
self.registered.insert(name, Arc::from(factory));
}
pub fn get(&self, name: &str) -> Option<Arc<dyn PreprocessorFactory>> {
self.registered.get(name).cloned()
}
}