use crate::error::Result;
use crate::scalar::ScalarValue;
use crate::variable::VarProvider;
use arrow::datatypes::DataType;
#[derive(Default)]
pub struct SystemVar {}
impl SystemVar {
pub fn new() -> Self {
Self {}
}
}
impl VarProvider for SystemVar {
fn get_value(&self, var_names: Vec<String>) -> Result<ScalarValue> {
let s = format!("{}-{}", "system-var", var_names.concat());
Ok(ScalarValue::Utf8(Some(s)))
}
fn get_type(&self, _: &[String]) -> Option<DataType> {
Some(DataType::Utf8)
}
}
#[derive(Default)]
pub struct UserDefinedVar {}
impl UserDefinedVar {
pub fn new() -> Self {
Self {}
}
}
impl VarProvider for UserDefinedVar {
fn get_value(&self, var_names: Vec<String>) -> Result<ScalarValue> {
if var_names[0] != "@integer" {
let s = format!("{}-{}", "user-defined-var", var_names.concat());
Ok(ScalarValue::Utf8(Some(s)))
} else {
Ok(ScalarValue::Int32(Some(41)))
}
}
fn get_type(&self, var_names: &[String]) -> Option<DataType> {
if var_names[0] != "@integer" {
Some(DataType::Utf8)
} else {
Some(DataType::Int32)
}
}
}