use std::fmt::Debug;
use std::sync::Arc;
use vortex_error::VortexResult;
use vortex_session::VortexSession;
use crate::scalar_fn::ScalarFn;
use crate::scalar_fn::ScalarFnId;
use crate::scalar_fn::ScalarFnRef;
use crate::scalar_fn::ScalarFnVTable;
pub type ScalarFnPluginRef = Arc<dyn ScalarFnPlugin>;
pub trait ScalarFnPlugin: 'static + Send + Sync {
fn id(&self) -> ScalarFnId;
fn deserialize(&self, metadata: &[u8], session: &VortexSession) -> VortexResult<ScalarFnRef>;
}
impl Debug for dyn ScalarFnPlugin {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_tuple("ScalarFnPlugin").field(&self.id()).finish()
}
}
impl<V: ScalarFnVTable> ScalarFnPlugin for V {
fn id(&self) -> ScalarFnId {
ScalarFnVTable::id(self)
}
fn deserialize(&self, metadata: &[u8], session: &VortexSession) -> VortexResult<ScalarFnRef> {
let options = ScalarFnVTable::deserialize(self, metadata, session)?;
Ok(ScalarFn::new(self.clone(), options).erased())
}
}