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;