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()),
}]
}