rustleaf 0.1.0

A simple programming language interpreter written in Rust
Documentation
use crate::core::{ParameterKind, Value};

#[derive(Debug, Clone)]
pub struct Params {
    inner: Vec<(String, Option<Value>, ParameterKind)>,
}

impl Params {
    pub fn new() -> Self {
        Self { inner: Vec::new() }
    }

    pub fn from_vec(params: Vec<(String, Option<Value>, ParameterKind)>) -> Self {
        Self { inner: params }
    }

    pub fn add_regular(mut self, name: impl Into<String>) -> Self {
        self.inner.push((name.into(), None, ParameterKind::Regular));
        self
    }

    pub fn add_with_default(mut self, name: impl Into<String>, default: Value) -> Self {
        self.inner
            .push((name.into(), Some(default), ParameterKind::Regular));
        self
    }

    pub fn add_rest(mut self, name: impl Into<String>) -> Self {
        self.inner.push((name.into(), None, ParameterKind::Rest));
        self
    }

    pub fn add_keyword(mut self, name: impl Into<String>) -> Self {
        self.inner.push((name.into(), None, ParameterKind::Keyword));
        self
    }

    pub fn from_names(names: &[String]) -> Self {
        let inner = names
            .iter()
            .map(|name| (name.clone(), None, ParameterKind::Regular))
            .collect();
        Self { inner }
    }

    pub fn iter(&self) -> impl Iterator<Item = &(String, Option<Value>, ParameterKind)> {
        self.inner.iter()
    }

    pub fn len(&self) -> usize {
        self.inner.len()
    }

    pub fn is_empty(&self) -> bool {
        self.inner.is_empty()
    }

    pub fn names(&self) -> Vec<&str> {
        self.inner
            .iter()
            .map(|(name, _, _)| name.as_str())
            .collect()
    }

    pub fn get(&self, index: usize) -> Option<&(String, Option<Value>, ParameterKind)> {
        self.inner.get(index)
    }

    pub fn into_inner(self) -> Vec<(String, Option<Value>, ParameterKind)> {
        self.inner
    }

    pub fn as_slice(&self) -> &[(String, Option<Value>, ParameterKind)] {
        &self.inner
    }
}

impl Default for Params {
    fn default() -> Self {
        Self::new()
    }
}

impl From<Vec<(String, Option<Value>, ParameterKind)>> for Params {
    fn from(params: Vec<(String, Option<Value>, ParameterKind)>) -> Self {
        Self::from_vec(params)
    }
}

impl From<Params> for Vec<(String, Option<Value>, ParameterKind)> {
    fn from(params: Params) -> Self {
        params.into_inner()
    }
}