isoloom_spec/model/
target.rs1use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize, JsonSchema)]
8#[serde(rename_all = "kebab-case")]
9pub enum Target {
10 Docker,
12 Hosted,
14 DockerVm,
16 CloudDocker,
18 Kubernetes,
20 Hybrid,
23 Vagrant,
25 Proxmox,
27 Esxi,
29 CloudVm,
31 External,
34 CloudServices,
37}
38
39impl Target {
40 pub const ALL: [Target; 12] = [
42 Target::Docker,
43 Target::Hosted,
44 Target::DockerVm,
45 Target::CloudDocker,
46 Target::Kubernetes,
47 Target::Hybrid,
48 Target::Vagrant,
49 Target::Proxmox,
50 Target::Esxi,
51 Target::CloudVm,
52 Target::External,
53 Target::CloudServices,
54 ];
55
56 #[must_use]
58 pub fn needs(self) -> Shape {
59 match self {
60 Target::Docker | Target::Hosted | Target::DockerVm | Target::CloudDocker | Target::Kubernetes => Shape::Docker,
61 Target::Vagrant | Target::Esxi | Target::CloudVm => Shape::Vm,
62 Target::Proxmox => Shape::VmOrLxc,
63 Target::Hybrid => Shape::Either,
64 Target::External => Shape::External,
65 Target::CloudServices => Shape::Cloud,
66 }
67 }
68
69 #[must_use]
71 pub fn id(self) -> &'static str {
72 match self {
73 Target::Docker => "docker",
74 Target::Hosted => "hosted",
75 Target::DockerVm => "docker-vm",
76 Target::CloudDocker => "cloud-docker",
77 Target::Kubernetes => "kubernetes",
78 Target::Hybrid => "hybrid",
79 Target::Vagrant => "vagrant",
80 Target::Proxmox => "proxmox",
81 Target::Esxi => "esxi",
82 Target::CloudVm => "cloud-vm",
83 Target::External => "external",
84 Target::CloudServices => "cloud-services",
85 }
86 }
87}
88
89#[derive(Debug, Clone, Copy, PartialEq, Eq)]
91pub enum Shape {
92 Docker,
94 Vm,
96 Either,
98 VmOrLxc,
100 External,
102 Cloud,
104}
105
106impl Shape {
107 #[must_use]
109 pub fn key(self) -> &'static str {
110 match self {
111 Shape::Docker => "docker",
112 Shape::Vm => "vm",
113 Shape::Either => "docker` or `vm",
114 Shape::VmOrLxc => "docker.lxc` or `vm",
115 Shape::External => "external",
116 Shape::Cloud => "cloud",
117 }
118 }
119}
120
121#[cfg(test)]
122mod tests {
123 use super::*;
124
125 #[test]
126 fn a_shape_names_the_keys_a_refusal_quotes() {
127 let quoted = [Shape::Docker, Shape::Vm, Shape::Either, Shape::VmOrLxc, Shape::External, Shape::Cloud].map(|s| format!("`{}`", s.key()));
128 assert_eq!(
129 quoted,
130 ["`docker`", "`vm`", "`docker` or `vm`", "`docker.lxc` or `vm`", "`external`", "`cloud`"]
131 );
132 }
133}