#[derive(Debug, Clone, PartialEq, Serialize, JsonSchema)]
pub struct FileFailure {
pub path: String,
pub code: &'static str,
pub message: String,
}
#[must_use]
pub fn partial_of(files_failed: Option<u64>) -> Option<bool> {
files_failed.map(|_| true)
}
#[derive(Debug, PartialEq, Serialize, JsonSchema)]
pub struct FailureSummary {
#[serde(flatten)]
pub base: Summary,
#[serde(skip_serializing_if = "Option::is_none")]
pub files_failed: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub partial: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub errors: Option<Vec<FileFailure>>,
}
#[derive(Debug, Default)]
pub struct FailureTally {
count: u64,
items: Vec<FileFailure>,
first: Option<anyhow::Error>,
}
impl FailureTally {
pub fn record(&mut self, path: &std::path::Path, err: anyhow::Error) {
self.count = self.count.saturating_add(1);
if self.items.len() < crate::config::summary_errors_max_entries() {
self.items.push(FileFailure {
path: path.display().to_string(),
code: crate::output::failure_identity(&err).0,
message: crate::output::error_message(&err),
});
}
self.first.get_or_insert(err);
}
pub fn record_missing_roots(&mut self, missing: &[std::path::PathBuf]) {
for path in missing {
self.record(
path,
crate::error::AtomwriteError::NotFound { path: path.clone() }.into(),
);
}
}
#[must_use]
pub fn count(&self) -> u64 {
self.count
}
#[must_use]
pub fn explains(&self, path: &std::path::Path) -> bool {
self.items.iter().any(|item| {
let failed = std::path::Path::new(&item.path);
path.starts_with(failed) || failed.starts_with(path)
})
}
#[must_use]
pub fn into_parts(self) -> (u64, Vec<FileFailure>, Option<anyhow::Error>) {
(self.count, self.items, self.first)
}
#[must_use]
pub fn into_summary(self, base: Summary) -> (FailureSummary, Option<anyhow::Error>) {
let files_failed = (self.count > 0).then_some(self.count);
let summary = FailureSummary {
base,
files_failed,
partial: partial_of(files_failed),
errors: (!self.items.is_empty()).then_some(self.items),
};
(summary, self.first)
}
}
#[derive(Debug, Serialize, JsonSchema)]
#[serde(untagged)]
pub enum DiffOutput<'a> {
Change(DiffChangeOutput<'a>),
Summary(DiffSummaryOutput),
Unified(DiffUnifiedOutput),
Stat(DiffStatOutput),
}