typeline_core/
extension.rs

1use std::{borrow::Cow, collections::HashMap, sync::Arc};
2
3use crate::{
4    cli::call_expr::Argument, operators::operator::Operator,
5    options::session_setup::SessionSetupData,
6    record_data::field_value::FieldValue, typeline_error::TypelineError,
7    tyson::TysonParseError,
8};
9
10pub trait CustomTysonType: Send + Sync {
11    fn parse(&self, value: &str) -> Result<FieldValue, TysonParseError>;
12}
13
14#[derive(Default)]
15pub struct ExtensionRegistry {
16    pub extensions: Vec<Box<dyn Extension>>,
17    pub tyson_types: HashMap<Box<str>, Box<dyn CustomTysonType>>,
18}
19
20impl ExtensionRegistry {
21    pub fn new(
22        extensions: impl IntoIterator<Item = Box<dyn Extension>>,
23    ) -> Arc<ExtensionRegistry> {
24        let mut exts = ExtensionRegistry::default();
25        for ext in extensions {
26            exts.register(ext);
27        }
28        exts.setup();
29        Arc::new(exts)
30    }
31    pub fn register(&mut self, ext: Box<dyn Extension>) {
32        self.extensions.push(ext);
33    }
34    pub fn setup(&mut self) {
35        struct DummyExt;
36        impl Extension for DummyExt {
37            fn parse_call_expr(
38                &self,
39                _sess_opts: &mut SessionSetupData,
40                _arg: &mut Argument,
41            ) -> Result<Option<Box<dyn Operator>>, TypelineError> {
42                Ok(None)
43            }
44
45            fn name(&self) -> Cow<'static, str> {
46                "dummy_extension".into()
47            }
48        }
49        let mut dummy_ext: Box<dyn Extension> = Box::new(DummyExt);
50        for i in 0..self.extensions.len() {
51            let mut ext =
52                std::mem::replace(&mut self.extensions[i], dummy_ext);
53            ext.setup(self);
54            dummy_ext = std::mem::replace(&mut self.extensions[i], ext);
55        }
56    }
57}
58
59pub trait Extension: Send + Sync {
60    fn name(&self) -> Cow<'static, str>;
61    fn setup(&mut self, _registry: &mut ExtensionRegistry) {}
62    fn parse_call_expr(
63        &self,
64        sess_opts: &mut SessionSetupData,
65        arg: &mut Argument,
66    ) -> Result<Option<Box<dyn Operator>>, TypelineError>;
67}
68
69pub fn build_empty_extension_registry() -> Arc<ExtensionRegistry> {
70    Arc::new(ExtensionRegistry::default())
71}