use anyhow::{Context, Result};
use crate::cli::{InspectBackendArgs, PresetPolicy};
use crate::io::print_kv;
use hsh::policy::Policy;
const HSH_VERSION: &str = env!("CARGO_PKG_VERSION");
const TARGET_TRIPLE: &str = env!("HSH_TARGET_TRIPLE");
const PROFILE: &str = env!("HSH_PROFILE");
const RUSTC_VERSION: &str = env!("HSH_RUSTC_VERSION");
pub(crate) fn run(args: InspectBackendArgs, json: bool) -> Result<()> {
let preset_name = match args.policy {
PresetPolicy::Owasp => "owasp_minimum_2025",
PresetPolicy::Rfc9106 => "rfc9106_first_recommended",
PresetPolicy::Fips => "fips_140_pbkdf2",
};
let policy = match args.policy {
PresetPolicy::Owasp => Policy::owasp_minimum_2025(),
PresetPolicy::Rfc9106 => Policy::rfc9106_first_recommended(),
PresetPolicy::Fips => Policy::fips_140_pbkdf2(),
};
let backend_label = if policy.backend().is_fips() {
"Fips140Required"
} else {
"Native"
};
let primary = format!("{:?}", policy.primary());
let fips_available = hsh::Backend::fips_available_in_build();
let pepper_feature = cfg!(feature = "pepper");
let satisfies = if policy.backend().is_fips() {
fips_available
} else {
true
};
let satisfies_label = if satisfies {
"satisfied"
} else {
"unsatisfied (build cannot provide a FIPS-validated route)"
};
let pairs: Vec<(String, serde_json::Value)> = vec![
("preset".into(), preset_name.into()),
("backend".into(), backend_label.into()),
("primary_algorithm".into(), primary.into()),
(
"fips_available_in_build".into(),
serde_json::Value::Bool(fips_available),
),
(
"pepper_feature_compiled".into(),
serde_json::Value::Bool(pepper_feature),
),
("readiness".into(), satisfies_label.into()),
("hsh_cli_version".into(), HSH_VERSION.into()),
("rustc".into(), RUSTC_VERSION.into()),
("target_triple".into(), TARGET_TRIPLE.into()),
("profile".into(), PROFILE.into()),
];
emit(json, &pairs).context("emit inspect-backend output")
}
fn emit(
json: bool,
pairs: &[(String, serde_json::Value)],
) -> Result<()> {
let kv: Vec<(&str, &serde_json::Value)> =
pairs.iter().map(|(k, v)| (k.as_str(), v)).collect();
print_kv(json, &kv)
}