use std::collections::HashMap;
use std::sync::{Arc, RwLock};
use crate::value_word::ValueWord;
pub type VMArray = Arc<Vec<ValueWord>>;
#[derive(Debug, Clone)]
pub enum Upvalue {
Immutable(ValueWord),
Mutable(Arc<RwLock<ValueWord>>),
}
impl Upvalue {
#[inline]
pub fn new(value: ValueWord) -> Self {
Upvalue::Immutable(value)
}
#[inline]
pub fn new_mutable(value: ValueWord) -> Self {
Upvalue::Mutable(Arc::new(RwLock::new(value)))
}
#[inline]
pub fn get(&self) -> ValueWord {
match self {
Upvalue::Immutable(nb) => nb.clone(),
Upvalue::Mutable(arc) => arc.read().unwrap().clone(),
}
}
pub fn set(&mut self, value: ValueWord) {
match self {
Upvalue::Mutable(arc) => {
*arc.write().unwrap() = value;
}
Upvalue::Immutable(_) => {
*self = Upvalue::Mutable(Arc::new(RwLock::new(value)));
}
}
}
}
#[derive(Debug, Clone)]
pub struct PrintResult {
pub rendered: String,
pub spans: Vec<PrintSpan>,
}
#[derive(Debug, Clone)]
pub enum PrintSpan {
Literal {
text: String,
start: usize,
end: usize,
span_id: String,
},
Value {
text: String,
start: usize,
end: usize,
span_id: String,
variable_name: Option<String>,
raw_value: Box<ValueWord>,
type_name: String,
current_format: String,
format_params: HashMap<String, ValueWord>,
},
}
#[derive(Clone)]
pub struct HostCallable {
inner: Arc<dyn Fn(&[ValueWord]) -> Result<ValueWord, String> + Send + Sync>,
}
impl HostCallable {
pub fn new(
f: impl Fn(&[ValueWord]) -> Result<ValueWord, String> + Send + Sync + 'static,
) -> Self {
Self { inner: Arc::new(f) }
}
pub fn call(&self, args: &[ValueWord]) -> Result<ValueWord, String> {
(self.inner)(args)
}
}
impl std::fmt::Debug for HostCallable {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("<host_closure>")
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum FilterOp {
Eq,
Neq,
Gt,
Gte,
Lt,
Lte,
}
#[derive(Debug, Clone, PartialEq)]
pub enum FilterLiteral {
Int(i64),
Float(f64),
String(String),
Bool(bool),
Null,
}
#[derive(Debug, Clone, PartialEq)]
pub enum FilterNode {
Compare {
column: String,
op: FilterOp,
value: FilterLiteral,
},
And(Box<FilterNode>, Box<FilterNode>),
Or(Box<FilterNode>, Box<FilterNode>),
Not(Box<FilterNode>),
}
#[derive(Debug, Clone)]
pub struct VTable {
pub trait_names: Vec<String>,
pub methods: HashMap<String, VTableEntry>,
}
#[derive(Debug, Clone)]
pub enum VTableEntry {
FunctionId(u16),
Closure {
function_id: u16,
upvalues: Vec<Upvalue>,
},
}
pub fn vmarray_from_value_words(iter: impl IntoIterator<Item = ValueWord>) -> VMArray {
Arc::new(iter.into_iter().collect())
}
pub fn vmarray_from_nanboxed(iter: impl IntoIterator<Item = ValueWord>) -> VMArray {
vmarray_from_value_words(iter)
}