use std::path::Path;
use crate::ktlint::sha256::sha256;
use crate::ktlint::zip_directory::read_zip_directory;
pub fn native_compose_rules_release(jar: &Path) -> Option<&'static str> {
let fingerprint = fingerprint(&[jar])?;
ktrs_compose::NATIVE_JARS.iter().find(|(_, known)| *known == fingerprint).map(|(release, _)| *release)
}
fn fingerprint(jars: &[&Path]) -> Option<String> {
let mut lines: Vec<String> = Vec::new();
for jar in jars {
lines.extend(
read_zip_directory(jar)
.ok()?
.into_iter()
.filter(|e| e.name.starts_with("io/nlopez/compose/") && !e.name.ends_with('/'))
.map(|e| format!("{}\t{:08x}\t{}\n", e.name, e.crc32, e.size)),
);
}
if lines.is_empty() {
return None;
}
lines.sort();
Some(sha256(lines.concat().as_bytes()).iter().map(|b| format!("{b:02x}")).collect())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn pinned_release_jar_is_native() {
let lib = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../tools/compose-rules/lib");
let version = ktrs_compose::COMPOSE_RULES_VERSION;
let jar = lib.join(format!("ktlint-compose-{version}-all.jar"));
if jar.is_file() {
assert_eq!(native_compose_rules_release(&jar), Some(version));
}
assert_eq!(native_compose_rules_release(&lib.join("missing.jar")), None);
}
#[test]
fn pinned_maven_artifacts_merged_are_native() {
let lib = Path::new(env!("CARGO_MANIFEST_DIR")).join("../../tools/compose-rules/lib");
let version = ktrs_compose::COMPOSE_RULES_VERSION;
let (thin, common) = (lib.join(format!("ktlint-{version}.jar")), lib.join(format!("common-ktlint-{version}.jar")));
if thin.is_file() && common.is_file() {
let merged = fingerprint(&[&thin, &common]).unwrap();
assert!(ktrs_compose::NATIVE_JARS.contains(&(version, merged.as_str())), "{merged}");
assert_eq!(native_compose_rules_release(&thin), None, "the thin JAR alone can't load");
}
}
}