xbp 10.28.0

XBP is a zero-config build pack that can also interact with proxies, kafka, sockets, synthetic monitors.
Documentation
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(())
}