xbp 10.28.0

XBP is a zero-config build pack that can also interact with proxies, kafka, sockets, synthetic monitors.
Documentation
use serde::{Deserialize, Serialize};

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ProviderStatus {
    Implemented,
    Planned,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ProviderDomain {
    Secrets,
    Dns,
    Domains,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ProviderDescriptor {
    pub key: String,
    pub label: String,
    pub domain: ProviderDomain,
    pub status: ProviderStatus,
    pub capabilities: Vec<String>,
    pub notes: Option<String>,
}

pub fn secrets_providers() -> Vec<ProviderDescriptor> {
    vec![
        ProviderDescriptor {
            key: "github".to_string(),
            label: "GitHub".to_string(),
            domain: ProviderDomain::Secrets,
            status: ProviderStatus::Implemented,
            capabilities: vec![
                "env_sync.list".to_string(),
                "env_sync.push".to_string(),
                "env_sync.pull".to_string(),
                "env_sync.diff".to_string(),
                "env_sync.verify".to_string(),
                "env_sync.diag".to_string(),
            ],
            notes: Some("GitHub Actions environment variable sync.".to_string()),
        },
        ProviderDescriptor {
            key: "cloudflare".to_string(),
            label: "Cloudflare".to_string(),
            domain: ProviderDomain::Secrets,
            status: ProviderStatus::Implemented,
            capabilities: vec![
                "stores.list".to_string(),
                "stores.get".to_string(),
                "stores.create".to_string(),
                "stores.delete".to_string(),
                "secrets.list".to_string(),
                "secrets.get".to_string(),
                "secrets.create".to_string(),
                "secrets.edit".to_string(),
                "secrets.delete".to_string(),
                "secrets.delete_bulk".to_string(),
                "secrets.duplicate".to_string(),
                "quota.get".to_string(),
            ],
            notes: Some("Cloudflare Secrets Store APIs.".to_string()),
        },
    ]
}

pub fn dns_providers() -> Vec<ProviderDescriptor> {
    vec![
        ProviderDescriptor {
            key: "cloudflare".to_string(),
            label: "Cloudflare".to_string(),
            domain: ProviderDomain::Dns,
            status: ProviderStatus::Implemented,
            capabilities: vec![
                "zones.list".to_string(),
                "zones.get".to_string(),
                "zones.create".to_string(),
                "zones.edit".to_string(),
                "zones.delete".to_string(),
                "records.list".to_string(),
                "records.get".to_string(),
                "records.create".to_string(),
                "records.replace".to_string(),
                "records.edit".to_string(),
                "records.delete".to_string(),
                "records.batch".to_string(),
                "records.import".to_string(),
                "records.export".to_string(),
                "dnssec.get".to_string(),
                "dnssec.edit".to_string(),
                "settings.get".to_string(),
                "settings.edit".to_string(),
            ],
            notes: Some("Cloudflare core DNS APIs.".to_string()),
        },
        ProviderDescriptor {
            key: "hetzner".to_string(),
            label: "Hetzner".to_string(),
            domain: ProviderDomain::Dns,
            status: ProviderStatus::Planned,
            capabilities: vec![],
            notes: Some("Planned provider.".to_string()),
        },
        ProviderDescriptor {
            key: "vercel".to_string(),
            label: "Vercel".to_string(),
            domain: ProviderDomain::Dns,
            status: ProviderStatus::Planned,
            capabilities: vec![],
            notes: Some("Planned provider.".to_string()),
        },
        ProviderDescriptor {
            key: "custom".to_string(),
            label: "Custom".to_string(),
            domain: ProviderDomain::Dns,
            status: ProviderStatus::Planned,
            capabilities: vec![],
            notes: Some("Planned provider.".to_string()),
        },
    ]
}

pub fn domains_providers() -> Vec<ProviderDescriptor> {
    vec![ProviderDescriptor {
        key: "cloudflare".to_string(),
        label: "Cloudflare".to_string(),
        domain: ProviderDomain::Domains,
        status: ProviderStatus::Implemented,
        capabilities: vec![
            "domains.search".to_string(),
            "domains.check".to_string(),
            "domains.list".to_string(),
        ],
        notes: Some("Registrar discovery endpoints only in v1.".to_string()),
    }]
}