use crate::error::Result;
pub use zlayer_types::package_index::{FormulaData as Formula, UsesFromMacos};
pub async fn fetch_formula(formula: &str) -> Result<Formula> {
tracing::info!("Resolving Homebrew formula metadata for: {formula}");
crate::package_index::PackageIndexClient::from_env()
.get_formula(formula)
.await
}
#[cfg(test)]
mod tests {
use super::*;
const GIT_JSON: &str = r#"{
"versions": {"stable": "2.55.0"},
"urls": {"stable": {"url": "https://example/git-2.55.0.tar.xz", "checksum": "sha256:abc123"}},
"dependencies": ["pcre2", "gettext"],
"build_dependencies": ["gettext", "pkgconf"],
"uses_from_macos": ["curl", "expat", {"llvm": ["build"]}],
"ruby_source_path": "Formula/g/git.rb"
}"#;
#[test]
fn parses_all_unified_fields_including_checksum() {
let f: Formula = serde_json::from_str(GIT_JSON).unwrap();
assert_eq!(f.stable_version(), Some("2.55.0"));
assert_eq!(f.stable_url(), Some("https://example/git-2.55.0.tar.xz"));
assert_eq!(f.stable_checksum().as_deref(), Some("abc123"));
assert_eq!(f.dependencies, vec!["pcre2", "gettext"]);
assert_eq!(f.build_dependencies, vec!["gettext", "pkgconf"]);
assert_eq!(f.ruby_source_path.as_deref(), Some("Formula/g/git.rb"));
assert_eq!(f.macos_provided(), vec!["curl", "expat", "llvm"]);
}
#[test]
fn missing_fields_default_cleanly() {
let f: Formula = serde_json::from_str("{}").unwrap();
assert_eq!(f.stable_version(), None);
assert_eq!(f.stable_url(), None);
assert_eq!(f.stable_checksum(), None);
assert!(f.dependencies.is_empty());
assert!(f.build_dependencies.is_empty());
assert!(f.macos_provided().is_empty());
assert!(f.ruby_source_path.is_none());
}
#[test]
fn empty_version_and_url_are_treated_as_absent() {
let f: Formula =
serde_json::from_str(r#"{"versions":{"stable":""},"urls":{"stable":{"url":""}}}"#)
.unwrap();
assert_eq!(f.stable_version(), None);
assert_eq!(f.stable_url(), None);
}
#[test]
fn uses_from_macos_name_accessor() {
let bare = UsesFromMacos::Name("curl".to_string());
assert_eq!(bare.name(), Some("curl"));
}
}