1use std::fmt;
2use std::str::FromStr;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum Provider {
7 Auto,
9 Local,
11 Aws,
13 Azure,
15 Gcp,
17 K8s,
19}
20
21impl Provider {
22 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 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}