wp-lang 0.3.0

WPL language crate with AST, parser, evaluator, builtins, and generators.
Documentation
use thiserror::Error;

use crate::ast::WplField;
use crate::compat::{OptionConv, OptionError};
use crate::parser::error::{IntoWplCodeError, WplCodeError, WplCodeReason};

#[derive(Error, Debug, PartialEq)]
pub enum FieldError {
    #[error("filed define less : {0} ")]
    LessData(String),
    #[error("filed conf less : {0} ")]
    LessConf(String),
    #[error("field is empty ")]
    Empty,
}

impl IntoWplCodeError for FieldError {
    fn into_wpl_err(self) -> WplCodeError {
        let msg = self.to_string();
        WplCodeError::builder(WplCodeReason::Plugin)
            .detail(msg)
            .finish()
    }
}

impl OptionError for FieldError {
    fn empty() -> Self {
        FieldError::Empty
    }

    fn less(msg: String) -> Self {
        FieldError::LessConf(msg)
    }
}

impl<'a> OptionConv<&'a WplField, FieldError> for Option<&'a WplField> {
    fn no_less(self, name: &str) -> Result<&'a WplField, FieldError> {
        self.ok_or(FieldError::LessConf(format!("{} less", name)))
    }
    fn no_empty(self) -> Result<&'a WplField, FieldError> {
        self.ok_or(FieldError::Empty)
    }
}

#[cfg(test)]
mod test {
    use crate::ast::WplField;
    use crate::compat::OptionConv;
    use crate::eval::value::error::FieldError;

    //test option conv

    #[test]
    fn test_option_conv() {
        let conf = None::<&WplField>.no_empty();
        assert_eq!(conf, Err(FieldError::Empty));
    }
}