Skip to main content

vortex_array/scalar_fn/
plugin.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use std::fmt::Debug;
5use std::sync::Arc;
6
7use vortex_error::VortexResult;
8use vortex_session::VortexSession;
9
10use crate::scalar_fn::ScalarFn;
11use crate::scalar_fn::ScalarFnId;
12use crate::scalar_fn::ScalarFnRef;
13use crate::scalar_fn::ScalarFnVTable;
14
15/// Reference-counted pointer to a scalar function plugin.
16pub type ScalarFnPluginRef = Arc<dyn ScalarFnPlugin>;
17
18/// Registry trait for ID-based deserialization of scalar functions.
19///
20/// Plugins are registered in the session by their [`ScalarFnId`]. When a serialized scalar
21/// function is encountered, the session resolves the ID to the plugin and calls [`deserialize`]
22/// to reconstruct the value as a [`ScalarFnRef`].
23///
24/// [`deserialize`]: ScalarFnPlugin::deserialize
25pub trait ScalarFnPlugin: 'static + Send + Sync {
26    /// Returns the ID for this scalar function.
27    fn id(&self) -> ScalarFnId;
28
29    /// Deserialize a scalar function from serialized metadata.
30    fn deserialize(&self, metadata: &[u8], session: &VortexSession) -> VortexResult<ScalarFnRef>;
31}
32
33impl Debug for dyn ScalarFnPlugin {
34    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35        f.debug_tuple("ScalarFnPlugin").field(&self.id()).finish()
36    }
37}
38
39impl<V: ScalarFnVTable> ScalarFnPlugin for V {
40    fn id(&self) -> ScalarFnId {
41        ScalarFnVTable::id(self)
42    }
43
44    fn deserialize(&self, metadata: &[u8], session: &VortexSession) -> VortexResult<ScalarFnRef> {
45        let options = ScalarFnVTable::deserialize(self, metadata, session)?;
46        Ok(ScalarFn::new(self.clone(), options).erased())
47    }
48}