secrets_core/
provider.rs

1use std::fmt;
2use std::str::FromStr;
3
4/// Supported secret providers that can be resolved at runtime.
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum Provider {
7    /// Auto-detect the provider using environment metadata.
8    Auto,
9    /// Use the in-process/local backends.
10    Local,
11    /// Use the AWS Secrets Manager backend.
12    Aws,
13    /// Use the Azure Key Vault backend.
14    Azure,
15    /// Use the Google Secret Manager backend.
16    Gcp,
17    /// Use the Kubernetes secrets backend.
18    K8s,
19}
20
21impl Provider {
22    /// Parse a provider from its environment representation.
23    pub fn from_env_value(value: &str) -> Option<Self> {
24        let trimmed = value.trim();
25        if trimmed.is_empty() {
26            return None;
27        }
28        trimmed.parse().ok()
29    }
30
31    /// Returns a static string identifier for the provider.
32    pub fn as_str(&self) -> &'static str {
33        match self {
34            Provider::Auto => "auto",
35            Provider::Local => "local",
36            Provider::Aws => "aws",
37            Provider::Azure => "azure",
38            Provider::Gcp => "gcp",
39            Provider::K8s => "k8s",
40        }
41    }
42}
43
44impl fmt::Display for Provider {
45    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46        f.write_str(self.as_str())
47    }
48}
49
50impl FromStr for Provider {
51    type Err = ();
52
53    fn from_str(value: &str) -> Result<Self, Self::Err> {
54        match value.trim().to_ascii_lowercase().as_str() {
55            "" | "auto" => Ok(Provider::Auto),
56            "local" | "dev" => Ok(Provider::Local),
57            "aws" => Ok(Provider::Aws),
58            "azure" => Ok(Provider::Azure),
59            "gcp" => Ok(Provider::Gcp),
60            "k8s" | "kubernetes" => Ok(Provider::K8s),
61            _ => Err(()),
62        }
63    }
64}