#![cfg(feature = "tools")]
use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
pub struct ValidationReport {
pub parse: LevelResult,
pub schema: LevelResult,
pub metadata: LevelResult,
}
impl ValidationReport {
#[must_use]
pub fn is_ok(&self) -> bool {
self.parse.is_ok_or_skipped()
&& self.schema.is_ok_or_skipped()
&& self.metadata.is_ok_or_skipped()
}
#[must_use]
pub fn error_count(&self) -> usize {
self.parse.error_count() + self.schema.error_count() + self.metadata.error_count()
}
}
#[derive(Debug, Clone, Serialize)]
pub enum LevelResult {
Ok,
Skipped {
reason: String,
},
Failed {
errors: Vec<Diagnostic>,
},
}
impl LevelResult {
#[must_use]
pub fn is_ok_or_skipped(&self) -> bool {
matches!(self, LevelResult::Ok | LevelResult::Skipped { .. })
}
#[must_use]
pub fn error_count(&self) -> usize {
match self {
LevelResult::Failed { errors } => errors.len(),
_ => 0,
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct Diagnostic {
pub file: String,
pub line: Option<usize>,
pub column: Option<usize>,
pub message: String,
}
#[derive(Debug, thiserror::Error)]
pub enum ValidateInfraError {
#[error("HTTP error: {0}")]
Http(#[from] reqwest::Error),
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("failed to build HTTP client: {0}")]
HttpClientBuild(#[from] crate::http::InitializeHttpClientError),
}