use async_trait::async_trait;
use pingap_certificate::rcgen;
use snafu::Snafu;
use substring::Substring;
pub static LOG_TARGET: &str = "pingap::acme";
#[derive(Debug, Snafu)]
pub enum Error {
#[snafu(display("ACME instant error: {source}, category: {category}"))]
Instant {
category: String,
source: instant_acme::Error,
},
#[snafu(display(
"Certificate generation error: {source}, category: {category}"
))]
Rcgen {
category: String,
source: rcgen::Error,
},
#[snafu(display("ACME challenge not found: {message}"))]
NotFound { message: String },
#[snafu(display(
"Let's Encrypt operation failed: {message}, category: {category}"
))]
Fail { category: String, message: String },
}
pub type Result<T, E = Error> = std::result::Result<T, E>;
fn get_value_from_env(value: &str) -> String {
if value.is_empty() {
return value.to_string();
}
let key_prefix = "$ENV:";
if value.starts_with(key_prefix) {
std::env::var(value.substring(key_prefix.len(), value.len()))
.unwrap_or(value.to_string())
} else {
value.to_string()
}
}
#[async_trait]
pub trait AcmeDnsTask: Sync + Send {
async fn add_txt_record(&self, domain: &str, value: &str) -> Result<()>;
async fn done(&self) -> Result<()>;
}
mod dns_ali;
mod dns_cf;
mod dns_huawei;
mod dns_manual;
mod dns_tencent;
mod lets_encrypt;
pub use lets_encrypt::{handle_lets_encrypt, new_lets_encrypt_service};