use std::path::Path;
use crate::party::{Results, Statement};
use crate::pipeline::{Error, RenderedFile, load_clean_root, load_party_json, to_json_document};
use crate::render::{render_certificate, render_report, render_statement};
use crate::schema::{results_schema, statement_schema};
use crate::verdict::VerdictReport;
#[derive(Debug)]
pub struct JudgementRequest<'a> {
pub statement: &'a Path,
pub results: &'a Path,
pub root: &'a Path,
}
#[derive(Debug)]
pub struct Judgement {
pub statement: Statement,
pub results: Results,
pub report: VerdictReport,
pub documents: Vec<RenderedFile>,
}
impl Judgement {
#[must_use]
pub fn is_clean(&self) -> bool {
self.report.review.is_empty()
}
}
pub fn judge(request: &JudgementRequest<'_>) -> Result<Judgement, Error> {
let statement: Statement = load_party_json(
request.statement,
&statement_schema(),
"statement.schema.json",
)?;
let results: Results =
load_party_json(request.results, &results_schema(), "results.schema.json")?;
results
.check_invariants()
.map_err(Error::ResultsInvariants)?;
let loaded = load_clean_root(request.root)?;
let Some((_, matrix)) = &loaded.set.matrix else {
return Err(Error::Missing(
"artifact tree carries no capability matrix".to_owned(),
));
};
let Some((_, register)) = &loaded.set.register else {
return Err(Error::Missing(
"artifact tree carries no ambiguity register".to_owned(),
));
};
let cases: Vec<_> = loaded.set.cases.iter().map(|(_, c)| c.clone()).collect();
let perf_cases: Vec<_> = loaded
.set
.performance
.iter()
.map(|(_, c)| c.clone())
.collect();
let report =
crate::verdict::compute(&statement, &results, &cases, &perf_cases, matrix, register);
let served_extensions = match &loaded.set.wire_surface {
Some((_, wire_surface)) => wire_surface.served_extensions.as_slice(),
None => &[],
};
let mut documents = vec![
RenderedFile {
name: "verdicts.json".to_owned(),
body: to_json_document(&report, "cannot serialize verdicts")?,
},
RenderedFile {
name: "CONFORMANCE_REPORT.md".to_owned(),
body: render_report(&results, &report, &statement)
.map_err(|e| Error::Instrument(format!("cannot render the report: {e}")))?,
},
RenderedFile {
name: "CONFORMANCE_STATEMENT.md".to_owned(),
body: render_statement(&statement, &report, served_extensions),
},
RenderedFile {
name: "CONFORMANCE_CERTIFICATE.md".to_owned(),
body: render_certificate(&statement, &results, &report, matrix),
},
];
for named in crate::badges::badges(&report, matrix, crate::badges::CaseCounts::of(&results)) {
let body = to_json_document(
&named.badge,
&format!("cannot serialize the {} badge", named.file),
)?;
documents.push(RenderedFile {
name: named.file,
body,
});
}
Ok(Judgement {
statement,
results,
report,
documents,
})
}