use std::collections::BTreeSet;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::argv::HostArgv;
use crate::list::NonEmpty;
use crate::names::{PinnedImage, ToolName, Version};
use crate::path::{PathTemplate, RelPath};
use crate::template::Template;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "kebab-case")]
pub enum Target {
Docker,
DockerVm,
Vagrant,
Proxmox,
Esxi,
CloudDocker,
CloudVm,
CloudServices,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum Cloud {
Aws,
Azure,
Gcp,
Digitalocean,
Linode,
Oci,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum Driver {
Compose,
Vagrant,
Terraform,
}
impl Driver {
#[must_use]
pub fn id(self) -> &'static str {
match self {
Driver::Compose => "compose",
Driver::Vagrant => "vagrant",
Driver::Terraform => "terraform",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum HostOs {
Linux,
Macos,
Windows,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum Provider {
Virtualbox,
VmwareDesktop,
Hyperv,
Parallels,
Libvirt,
Qemu,
Utm,
VmwareEsxi,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct Tool {
pub name: ToolName,
pub probe: HostArgv,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub min_version: Option<Version>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub container: Option<PinnedImage>,
#[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
pub container_hosts: BTreeSet<HostOs>,
#[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
pub hosts: BTreeSet<HostOs>,
#[serde(default, skip_serializing_if = "BTreeSet::is_empty")]
pub providers: BTreeSet<Provider>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct ComposeIdentity {
pub project: Template,
pub files: NonEmpty<PathTemplate>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub pinned_ports_file: Option<PathTemplate>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum Elevation {
#[default]
None,
Hyperv,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct VagrantProvider {
pub id: Provider,
pub hosts: BTreeSet<HostOs>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub plugin: Option<ToolName>,
#[serde(default)]
pub elevation: Elevation,
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
pub remote: bool,
#[serde(default)]
pub refusal: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct VagrantIdentity {
pub providers: Vec<VagrantProvider>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dotfile: Option<PathTemplate>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase")]
pub enum StateOwner {
Runner,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct TerraformIdentity {
pub module: RelPath,
pub state: StateOwner,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub var_files: Vec<RelPath>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "lowercase", deny_unknown_fields)]
pub enum Identity {
Compose(ComposeIdentity),
Vagrant(VagrantIdentity),
Terraform(TerraformIdentity),
}
impl Identity {
#[must_use]
pub fn driver(&self) -> Driver {
match self {
Identity::Compose(_) => Driver::Compose,
Identity::Vagrant(_) => Driver::Vagrant,
Identity::Terraform(_) => Driver::Terraform,
}
}
}