greentic_deployer/
adapter.rs1use serde::{Deserialize, Serialize};
2
3use crate::config::Provider;
4use crate::spec::DeploymentTarget;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case")]
9pub enum AdapterFamily {
10 SingleVm,
12 MultiTarget,
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
21#[serde(tag = "family", content = "target", rename_all = "snake_case")]
22pub enum UnifiedTargetSelection {
23 SingleVm,
24 MultiTarget(MultiTargetKind),
25}
26
27impl UnifiedTargetSelection {
28 pub fn adapter_family(self) -> AdapterFamily {
29 match self {
30 Self::SingleVm => AdapterFamily::SingleVm,
31 Self::MultiTarget(_) => AdapterFamily::MultiTarget,
32 }
33 }
34}
35
36#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
38#[serde(rename_all = "snake_case")]
39pub enum MultiTargetKind {
40 Local,
41 Aws,
42 Azure,
43 Gcp,
44 K8s,
45 Generic,
46}
47
48impl MultiTargetKind {
49 pub fn as_str(self) -> &'static str {
50 match self {
51 Self::Local => "local",
52 Self::Aws => "aws",
53 Self::Azure => "azure",
54 Self::Gcp => "gcp",
55 Self::K8s => "k8s",
56 Self::Generic => "generic",
57 }
58 }
59}
60
61impl From<Provider> for MultiTargetKind {
62 fn from(value: Provider) -> Self {
63 match value {
64 Provider::Local => Self::Local,
65 Provider::Aws => Self::Aws,
66 Provider::Azure => Self::Azure,
67 Provider::Gcp => Self::Gcp,
68 Provider::K8s => Self::K8s,
69 Provider::Generic => Self::Generic,
70 }
71 }
72}
73
74impl From<DeploymentTarget> for UnifiedTargetSelection {
75 fn from(value: DeploymentTarget) -> Self {
76 match value {
77 DeploymentTarget::SingleVm => Self::SingleVm,
78 }
79 }
80}
81
82#[cfg(test)]
83mod tests {
84 use super::*;
85
86 #[test]
87 fn single_vm_target_stays_in_single_vm_family() {
88 let selection = UnifiedTargetSelection::from(DeploymentTarget::SingleVm);
89 assert_eq!(selection, UnifiedTargetSelection::SingleVm);
90 assert_eq!(selection.adapter_family(), AdapterFamily::SingleVm);
91 }
92
93 #[test]
94 fn provider_targets_are_classified_as_multi_target_family() {
95 for provider in [
96 Provider::Local,
97 Provider::Aws,
98 Provider::Azure,
99 Provider::Gcp,
100 Provider::K8s,
101 Provider::Generic,
102 ] {
103 let selection = UnifiedTargetSelection::MultiTarget(MultiTargetKind::from(provider));
104 assert_eq!(selection.adapter_family(), AdapterFamily::MultiTarget);
105 }
106 }
107}