reifydb_flow_operator_abi/vtable.rs
1//! Virtual table definitions for FFI operators
2
3use core::ffi::c_void;
4
5use crate::types::*;
6
7/// Virtual function table for FFI operators
8///
9/// This unified interface provides all methods an operator might need.
10/// Operators that don't use certain features (e.g., state) simply won't
11/// call those methods. All function pointers must be valid (non-null).
12#[repr(C)]
13#[derive(Clone, Copy)]
14pub struct FFIOperatorVTable {
15 /// Apply the operator to a flow change
16 ///
17 /// # Parameters
18 /// - `instance`: The operator instance pointer
19 /// - `ctx`: FFI context for this operation
20 /// - `input`: Input flow change
21 /// - `output`: Output flow change (to be filled by operator)
22 ///
23 /// # Returns
24 /// - 0 on success, negative error code on failure
25 pub apply: extern "C" fn(
26 instance: *mut c_void,
27 ctx: *mut FFIContext,
28 input: *const FlowChangeFFI,
29 output: *mut FlowChangeFFI,
30 ) -> i32,
31
32 /// Get specific rows by their row numbers
33 ///
34 /// # Parameters
35 /// - `instance`: The operator instance pointer
36 /// - `ctx`: FFI context for this operation
37 /// - `row_numbers`: Array of row numbers to fetch
38 /// - `count`: Number of row numbers
39 /// - `output`: Output rows structure (to be filled)
40 ///
41 /// # Returns
42 /// - 0 on success, negative error code on failure
43 pub get_rows: extern "C" fn(
44 instance: *mut c_void,
45 ctx: *mut FFIContext,
46 row_numbers: *const u64,
47 count: usize,
48 output: *mut RowsFFI,
49 ) -> i32,
50
51 /// Destroy an operator instance and free its resources
52 ///
53 /// # Parameters
54 /// - `instance`: The operator instance pointer to destroy
55 ///
56 /// # Safety
57 /// - The instance pointer must have been created by this operator's create function
58 /// - The instance must not be used after calling destroy
59 /// - This function must be called exactly once per instance
60 pub destroy: extern "C" fn(instance: *mut c_void),
61}
62
63/// Descriptor for an FFI operator
64///
65/// This structure describes an operator's capabilities and provides
66/// its virtual function table.
67#[repr(C)]
68pub struct FFIOperatorDescriptor {
69 /// API version (must match CURRENT_API)
70 pub api: u32,
71
72 /// Operator name (UTF-8 encoded)
73 pub operator: BufferFFI,
74
75 /// Semantic version (UTF-8 encoded, e.g., "1.0.0")
76 pub version: BufferFFI,
77
78 /// Description (UTF-8 encoded)
79 pub description: BufferFFI,
80
81 /// Input columns describing expected input row format (for documentation)
82 pub input_columns: FFIOperatorColumnDefs,
83
84 /// Output columns describing output row format (for documentation)
85 pub output_columns: FFIOperatorColumnDefs,
86
87 /// Capabilities bitflags (CAPABILITY_* constants)
88 pub capabilities: u32,
89
90 /// Virtual function table with all operator methods
91 pub vtable: FFIOperatorVTable,
92}
93
94// SAFETY: FFIOperatorDescriptor contains pointers to static strings and functions
95// which are safe to share across threads
96unsafe impl Send for FFIOperatorDescriptor {}
97unsafe impl Sync for FFIOperatorDescriptor {}
98
99/// Factory function type for creating operator instances
100pub type FFIOperatorCreateFn = extern "C" fn(config: *const u8, config_len: usize, operator_id: u64) -> *mut c_void;