use crate::cli::commands::{DomainsCmd, DomainsProviderKind, DomainsSubCommand};
use crate::commands::cloudflare_credentials::{
build_cloudflare_client, CloudflareCredentialOverrides,
};
use crate::config::update_dns_inventory_cache;
pub async fn run_domains(cmd: DomainsCmd, _debug: bool) -> Result<(), String> {
if cmd.provider != DomainsProviderKind::Cloudflare {
return Err(
"Only Cloudflare is supported for `xbp domains` in this release.".to_string(),
);
}
let account_id_override = cmd.account_id.clone();
let client = build_cloudflare_client(
CloudflareCredentialOverrides {
token: cmd.token.clone(),
account_id: account_id_override.clone(),
},
true,
)
.await?;
let account_id = account_id_override;
match cmd.command {
DomainsSubCommand::Search(args) => {
let mut results = client.search_domains(&args.query, &args.extensions).await?;
if let Some(limit) = args.limit {
results.truncate(limit);
}
update_dns_inventory_cache(|cache| {
cache.record_cloudflare_domain_availability(account_id, &results)
})?;
print_json(&results)
}
DomainsSubCommand::Check(args) => {
let results = client.check_domains(&args.domains).await?;
update_dns_inventory_cache(|cache| {
cache.record_cloudflare_domain_availability(account_id, &results)
})?;
print_json(&results)
}
DomainsSubCommand::List(_) => {
let (domains, result_info) = client.list_registered_domains().await?;
update_dns_inventory_cache(|cache| {
cache.record_cloudflare_registered_domains(account_id, &domains)
})?;
print_json(&serde_json::json!({
"provider": "cloudflare",
"domains": domains,
"result_info": result_info
}))
}
}
}
fn print_json(value: &impl serde::Serialize) -> Result<(), String> {
println!(
"{}",
serde_json::to_string_pretty(value)
.map_err(|error| format!("Failed to encode JSON output: {}", error))?
);
Ok(())
}