rbx-rsml 1.0.0

A lexer and parser for the RSML language.
Documentation
mod tuple_annotations;
use tuple_annotations::TUPLE_ANNOTATIONS;

use crate::datatype::Datatype;

pub struct Tuple {
    pub name: Option<String>,
    data: Vec<Datatype>,
}

impl Tuple {
    pub fn new(name: Option<String>) -> Self {
        Self {
            name,
            data: vec![],
        }
    }

    pub fn coerce_to_datatype(&self) -> Datatype {
        let tuple_data = &self.data;

        if let Some(tuple_name) = &self.name {
            if let Some(annotation_function) = TUPLE_ANNOTATIONS.get(&tuple_name.to_lowercase()) {
                return annotation_function(tuple_data);
            }
        }

        let tuple_length = tuple_data.len();

        if tuple_length == 0 {
            Datatype::None
        } else if tuple_length == 1 {
            tuple_data[0].clone()
        } else {
            Datatype::TupleData(tuple_data.clone())
        }
    }

    pub fn push(&mut self, datatype: Datatype) {
        self.data.push(datatype);
    }
}