use sha2::{Digest, Sha256};
use crate::config::AnalysisConfig;
use crate::report::{FragmentCorpusProvenance, Provenance};
use crate::rules::RULESET_VERSION;
const SCHEMA_VERSION: &str = "0.6.0";
const CHEMATIC_VERSION_REQUIREMENT: &str = "0.12";
fn config_hash(config: &AnalysisConfig) -> String {
let canonical = serde_json::to_vec(config).expect("AnalysisConfig serialization is infallible");
let digest = Sha256::digest(&canonical);
format!("sha256:{digest:x}")
}
pub(crate) fn build(config: &AnalysisConfig) -> Provenance {
Provenance {
schema_version: SCHEMA_VERSION.to_string(),
yomitoki_version: env!("CARGO_PKG_VERSION").to_string(),
chematic_version: CHEMATIC_VERSION_REQUIREMENT.to_string(),
ruleset_version: RULESET_VERSION.to_string(),
fragment_corpus: config.fragment_model.corpus.as_deref().map(|corpus| {
FragmentCorpusProvenance {
version: corpus.version().to_string(),
source_name: corpus.domain.source_name.clone(),
domain: corpus.domain.domain.clone(),
synthesis_focused: corpus.domain.synthesis_focused,
description: corpus.domain.description.clone(),
fragment_definition_version: corpus.fragment_definition_version.clone(),
reference_distribution_version: corpus.reference_distribution_version.clone(),
}
}),
config_hash: config_hash(config),
}
}