use super::{
LEVEL_ERROR, LEVEL_INFO, LEVEL_WARNING, ValidationIssue, ValidationLevel,
format_specs::FormatSpecRef,
};
pub fn issue(
level: ValidationLevel,
path: impl AsRef<str>,
message: impl Into<String>,
) -> ValidationIssue {
ValidationIssue {
level: level.to_string(),
path: path.as_ref().to_string(),
message: message.into(),
line: None,
column: None,
rule_id: None,
metadata: None,
}
}
pub fn error(path: impl AsRef<str>, message: impl Into<String>) -> ValidationIssue {
issue(LEVEL_ERROR, path, message)
}
pub fn warning(path: impl AsRef<str>, message: impl Into<String>) -> ValidationIssue {
issue(LEVEL_WARNING, path, message)
}
pub fn info(path: impl AsRef<str>, message: impl Into<String>) -> ValidationIssue {
issue(LEVEL_INFO, path, message)
}
pub fn with_line(mut i: ValidationIssue, line: u32) -> ValidationIssue {
i.line = Some(line);
i
}
pub fn with_loc(mut i: ValidationIssue, line: u32, column: u32) -> ValidationIssue {
i.line = Some(line);
i.column = Some(column);
i
}
pub fn with_metadata(mut i: ValidationIssue, metadata: serde_json::Value) -> ValidationIssue {
i.metadata = Some(metadata);
i
}
pub fn with_rule_id(mut i: ValidationIssue, rule_id: impl Into<String>) -> ValidationIssue {
i.rule_id = Some(rule_id.into());
i
}
pub(crate) fn with_format_spec(mut i: ValidationIssue, spec: FormatSpecRef) -> ValidationIssue {
let mut obj = match i.metadata.take() {
Some(serde_json::Value::Object(map)) => map,
Some(other) => {
let mut map = serde_json::Map::new();
map.insert("original_metadata".to_string(), other);
map
}
None => serde_json::Map::new(),
};
obj.insert(
"validator_id".to_string(),
serde_json::Value::String(spec.validator_id.to_string()),
);
obj.insert(
"spec_path".to_string(),
serde_json::Value::String(spec.spec_path.to_string()),
);
if let Some(rule_id) = i.rule_id.as_ref() {
obj.insert(
"rule_id".to_string(),
serde_json::Value::String(rule_id.clone()),
);
}
i.metadata = Some(serde_json::Value::Object(obj));
if !i.message.contains(spec.validator_id) {
i.message = format!(
"{} (validator: {})",
i.message.trim_end(),
spec.validator_id
);
}
i
}
#[cfg(test)]
#[path = "issue_tests.rs"]
mod issue_tests;