use super::{truncate_value, IssueCode, PathSegment, ValidationIssue, VldError};
pub struct IssueBuilder<'a> {
errors: &'a mut VldError,
code: IssueCode,
message: Option<String>,
path: Vec<PathSegment>,
received: Option<serde_json::Value>,
}
impl<'a> IssueBuilder<'a> {
pub fn message(mut self, msg: impl Into<String>) -> Self {
self.message = Some(msg.into());
self
}
pub fn path_field(mut self, name: impl Into<String>) -> Self {
self.path.push(PathSegment::Field(name.into()));
self
}
pub fn path_index(mut self, idx: usize) -> Self {
self.path.push(PathSegment::Index(idx));
self
}
pub fn received(mut self, value: &serde_json::Value) -> Self {
self.received = Some(truncate_value(value));
self
}
pub fn finish(self) {
let mut issue = ValidationIssue::with_override(self.code, self.message.as_ref());
issue.path = self.path;
issue.received = self.received;
self.errors.issues.push(issue);
}
}
impl VldError {
pub fn issue(&mut self, code: IssueCode) -> IssueBuilder<'_> {
IssueBuilder {
errors: self,
code,
message: None,
path: vec![],
received: None,
}
}
}