typeline_core/
extension.rs1use 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}