use std::collections::HashMap;
use reifydb_type::value::{Value, row_number::RowNumber};
pub mod column;
pub mod context;
use column::OperatorColumnDef;
use context::OperatorContext;
use reifydb_core::{
interface::{catalog::flow::FlowNodeId, change::Change},
value::column::columns::Columns,
};
use crate::error::Result;
pub trait FFIOperatorMetadata {
const NAME: &'static str;
const API: u32;
const VERSION: &'static str;
const DESCRIPTION: &'static str;
const INPUT_COLUMNS: &'static [OperatorColumnDef];
const OUTPUT_COLUMNS: &'static [OperatorColumnDef];
const CAPABILITIES: u32;
}
pub trait FFIOperator: 'static {
fn new(operator_id: FlowNodeId, config: &HashMap<String, Value>) -> Result<Self>
where
Self: Sized;
fn apply(&mut self, ctx: &mut OperatorContext, input: Change) -> Result<Change>;
fn pull(&mut self, ctx: &mut OperatorContext, row_numbers: &[RowNumber]) -> Result<Columns>;
}
pub trait FFIOperatorWithMetadata: FFIOperator + FFIOperatorMetadata {}
impl<T> FFIOperatorWithMetadata for T where T: FFIOperator + FFIOperatorMetadata {}