#![allow(clippy::new_without_default)]
pub mod aggregate;
pub mod bind_state;
pub mod candidate;
pub mod cast;
pub mod documentation;
pub mod function_set;
pub mod implicit;
pub mod scalar;
pub mod table;
use candidate::CandidateSignature;
use crate::arrays::datatype::DataTypeId;
#[derive(Debug, Clone, Copy)]
pub struct Signature {
pub positional_args: &'static [DataTypeId],
pub variadic_arg: Option<DataTypeId>,
pub return_type: DataTypeId,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct NamedArgument {
pub name: &'static str,
pub arg: DataTypeId,
}
impl Signature {
pub const fn new(inputs: &'static [DataTypeId], return_type: DataTypeId) -> Self {
Signature {
positional_args: inputs,
variadic_arg: None,
return_type,
}
}
pub const fn is_variadic(&self) -> bool {
self.variadic_arg.is_some()
}
fn exact_match(&self, inputs: &[DataTypeId]) -> bool {
if self.is_variadic() {
if inputs.len() < self.positional_args.len() {
return false;
}
} else {
if inputs.len() != self.positional_args.len() {
return false;
}
}
for (&expected, &have) in self.positional_args.iter().zip(inputs.iter()) {
if expected == DataTypeId::Any {
continue;
}
if have != expected {
return false;
}
}
if let Some(expected) = self.variadic_arg {
let remaining = &inputs[self.positional_args.len()..];
for &have in remaining {
if expected == DataTypeId::Any {
return false;
}
if have != expected {
return false;
}
}
}
true
}
}
impl PartialEq for Signature {
fn eq(&self, other: &Self) -> bool {
self.positional_args == other.positional_args
&& self.variadic_arg == other.variadic_arg
&& self.return_type == other.return_type
}
}
impl Eq for Signature {}