use crate::script::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct ScriptCardinality;
#[derive(Debug, Clone)]
pub(crate) struct CardinalityValue {
pub(crate) cardinality: Cardinality,
pub(crate) value: Dynamic,
}
impl CardinalityValue {
pub(crate) fn new(cardinality: Cardinality, value: Dynamic) -> Self {
Self { cardinality, value }
}
}
impl crate::value::literal::TokenLiteral for CardinalityValue {
fn token_literal(&self) -> String {
format!(
"{}({})",
crate::value::literal::TokenLiteral::token_literal(&self.cardinality),
crate::script::render::value_literal(&self.value)
)
}
}
#[export_module]
#[allow(non_snake_case, non_upper_case_globals)]
pub(crate) mod CardinalityModule {
use super::{Cardinality, CardinalityValue};
use crate::value::literal::TokenLiteral;
pub const single: Cardinality = Cardinality::Single;
pub const list: Cardinality = Cardinality::List;
pub const set: Cardinality = Cardinality::Set;
#[rhai_fn(name = "single")]
pub fn single_value(value: Dynamic) -> CardinalityValue {
CardinalityValue::new(Cardinality::Single, value)
}
#[rhai_fn(name = "list")]
pub fn list_value(value: Dynamic) -> CardinalityValue {
CardinalityValue::new(Cardinality::List, value)
}
#[rhai_fn(name = "set")]
pub fn set_value(value: Dynamic) -> CardinalityValue {
CardinalityValue::new(Cardinality::Set, value)
}
#[rhai_fn(global, name = "to_string", name = "to_debug", pure)]
pub fn to_string(cardinality: &mut Cardinality) -> String {
cardinality.token_literal()
}
#[rhai_fn(global, name = "to_string", name = "to_debug", pure)]
pub fn value_to_string(value: &mut CardinalityValue) -> String {
value.token_literal()
}
}