use crate::cli::commands::{DomainsCmd, DomainsProviderKind, DomainsSubCommand};
use crate::config::{resolve_cloudflare_account_id, resolve_cloudflare_api_token};
use crate::provider_support::cloudflare::CloudflareClient;
pub async fn run_domains(cmd: DomainsCmd, _debug: bool) -> Result<(), String> {
let client = cloudflare_client(cmd.provider, cmd.token, cmd.account_id)?;
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);
}
print_json(&results)
}
DomainsSubCommand::Check(args) => print_json(&client.check_domains(&args.domains).await?),
DomainsSubCommand::List(_) => {
let (domains, result_info) = client.list_registered_domains().await?;
print_json(&serde_json::json!({
"provider": "cloudflare",
"domains": domains,
"result_info": result_info
}))
}
}
}
fn cloudflare_client(
provider: DomainsProviderKind,
token_override: Option<String>,
account_id_override: Option<String>,
) -> Result<CloudflareClient, String> {
if provider != DomainsProviderKind::Cloudflare {
return Err("Only Cloudflare is supported for `xbp domains` in this release.".to_string());
}
let token = token_override
.or_else(resolve_cloudflare_api_token)
.ok_or_else(|| {
"No Cloudflare API token found. Use `--token`, `CLOUDFLARE_API_TOKEN`, or `xbp config cloudflare set-key`.".to_string()
})?;
let account_id = account_id_override
.or_else(resolve_cloudflare_account_id)
.ok_or_else(|| {
"No Cloudflare account ID found. Use `--account-id`, `CLOUDFLARE_ACCOUNT_ID`, or `xbp config cloudflare set-account-id`.".to_string()
})?;
CloudflareClient::new(token, account_id)
}
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(())
}