use crate::entity::{CpeError, ErrorLevel};
pub trait ResultParser {
fn parse(&self, raw: &str) -> Option<CpeError>;
}
#[derive(Clone, Copy, Debug, Default)]
pub struct ErrorResultParser;
impl ResultParser for ErrorResultParser {
fn parse(&self, raw: &str) -> Option<CpeError> {
let parts: Vec<&str> = raw.split('|').collect();
if parts.len() < 3 {
return None;
}
let level = if parts[0] == ErrorLevel::Exception.code() {
ErrorLevel::Exception
} else {
ErrorLevel::Observation
};
let mut error = CpeError {
code: Some(parts[1].to_owned()),
message: Some(parts[2].to_owned()),
level: Some(level),
..CpeError::default()
};
if parts.len() >= 5 {
error.node_path = Some(parts[3].to_owned());
error.node_value = Some(parts[4].to_owned());
}
Some(error)
}
}
impl<P: ResultParser + ?Sized> ResultParser for &P {
fn parse(&self, raw: &str) -> Option<CpeError> {
(**self).parse(raw)
}
}