use std::collections::HashMap;
use linkrs_core::types::operators::BinaryOperator;
use linkrs_core::DataType;
use linkrs_core::Value;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ParameterSlot(pub usize);
#[derive(Debug, Clone)]
pub struct ParameterDesc {
pub name: String,
pub slot: ParameterSlot,
pub value_type: Option<DataType>,
pub nullable: bool,
pub default: Option<Value>,
}
#[derive(Debug, Clone, Default)]
pub struct ParameterSchema {
pub params: Vec<ParameterDesc>,
pub name_to_slot: HashMap<String, ParameterSlot>,
}
impl ParameterSchema {
pub fn new(params: Vec<ParameterDesc>) -> Self {
let name_to_slot = params.iter().map(|p| (p.name.clone(), p.slot)).collect();
Self {
params,
name_to_slot,
}
}
pub fn slot(&self, name: &str) -> Option<ParameterSlot> {
self.name_to_slot.get(name).copied()
}
pub fn len(&self) -> usize {
self.params.len()
}
pub fn is_empty(&self) -> bool {
self.params.is_empty()
}
}
#[derive(Debug, Clone)]
pub struct ParameterFrame {
pub values: Vec<Value>,
}
impl ParameterFrame {
pub fn new(values: Vec<Value>) -> Self {
Self { values }
}
pub fn get(&self, slot: ParameterSlot) -> Option<&Value> {
self.values.get(slot.0)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct SlotRef(pub usize);
#[derive(Debug, Clone)]
pub enum BoundExpression {
Literal(Value),
SlotRef(SlotRef),
ParameterRef(ParameterSlot),
Call {
name: String,
args: Vec<BoundExpression>,
},
Binary {
left: Box<BoundExpression>,
op: BinaryOperator,
right: Box<BoundExpression>,
},
Cast {
expr: Box<BoundExpression>,
target_type: DataType,
},
}