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 {
WplCodeReason::Plugin(self.to_string()).into()
}
}
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]
fn test_option_conv() {
let conf = None::<&WplField>.no_empty();
assert_eq!(conf, Err(FieldError::Empty));
}
}