Skip to main content

greentic_deployer/
adapter.rs

1use serde::{Deserialize, Serialize};
2
3use crate::config::Provider;
4use crate::spec::DeploymentTarget;
5
6/// Top-level execution family behind the unified deployer surface.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
8#[serde(rename_all = "snake_case")]
9pub enum AdapterFamily {
10    /// Stable OSS path for one Linux VM running one active bundle.
11    SingleVm,
12    /// Provider-oriented multi-target path used for cloud/k8s/generic adapters.
13    ///
14    /// Today this mostly represents the older generic deployer layer and is the
15    /// integration point for future non-single-vm adapters.
16    MultiTarget,
17}
18
19/// Unified deployment target selection used to keep adapter families explicit.
20#[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/// Provider-oriented target kinds that must stay outside the single-vm adapter path.
37#[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}