use crate::core::spec_error::SpecError;
pub(crate) enum SpecValidationResult<T: Clone> {
Valid(T),
Invalid(T, Vec<String>)
}
impl <T: Clone> From<SpecValidationResult<T>> for Result<T, SpecError> {
fn from(result: SpecValidationResult<T>) -> Result<T, SpecError> {
match result {
SpecValidationResult::Valid(value) => Ok(value),
SpecValidationResult::Invalid(_, reasons) => Err(SpecError::unnamed(reasons))
}
}
}
impl <T: Clone> SpecValidationResult<T> {
pub(crate) fn valid(t: T) -> SpecValidationResult<T> {
SpecValidationResult::Valid(t)
}
pub(crate) fn invalid(t: T, reasons: Vec<String>) -> SpecValidationResult<T> {
SpecValidationResult::Invalid(t, reasons)
}
pub(crate) fn fail(self, reason: String) -> SpecValidationResult<T> {
match self {
SpecValidationResult::Valid(v) => {
SpecValidationResult::invalid(v, vec![reason.to_string()])
},
SpecValidationResult::Invalid(v, mut reasons) => {
reasons.push(reason.to_string());
SpecValidationResult::invalid(v, reasons)
}
}
}
pub(crate) fn value(&self) -> T {
match self {
SpecValidationResult::Valid(value) => value.clone(),
SpecValidationResult::Invalid(value, _) => value.clone()
}
}
}