use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(untagged)]
pub enum CommandList {
One(String),
Many(Vec<String>),
}
impl CommandList {
pub fn to_vec(&self) -> Vec<String> {
match self {
CommandList::One(s) => vec![s.clone()],
CommandList::Many(v) => v.clone(),
}
}
}
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(untagged)]
pub enum VolumeSpec {
String(String),
Object {
source: String,
target: String,
#[serde(default)]
readonly: bool,
},
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct VolumeMount {
pub source: String,
pub target: String,
pub readonly: bool,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct ServiceConfig {
pub name: String,
pub image: String,
#[serde(default)]
pub env: Option<HashMap<String, String>>,
#[serde(default)]
pub ports: Option<Vec<String>>,
#[serde(default)]
pub volumes: Option<Vec<VolumeSpec>>,
#[serde(default)]
pub command: Option<CommandList>,
#[serde(default)]
pub workdir: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default)]
pub struct ConfigFile {
#[serde(default)]
pub image: Option<String>,
#[serde(default)]
pub network: Option<String>,
#[serde(default)]
pub workdir: Option<String>,
#[serde(default)]
pub env: Option<HashMap<String, String>>,
#[serde(default)]
pub volumes: Option<Vec<VolumeSpec>>,
#[serde(default)]
pub ports: Option<Vec<String>>,
#[serde(default)]
pub pre_install: Option<CommandList>,
#[serde(default)]
pub run: Option<CommandList>,
#[serde(default)]
pub services: Option<Vec<ServiceConfig>>,
}
#[derive(Debug, Clone)]
pub struct ResolvedConfig {
pub image: String,
pub network: Option<String>,
pub workdir: String,
pub env: HashMap<String, String>,
pub volumes: Vec<VolumeMount>,
pub ports: Vec<String>,
pub pre_install: Vec<String>,
pub run: Vec<String>,
pub services: Vec<ServiceConfig>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct RunMeta {
pub id: String,
pub created_at: String,
pub repo_root: String,
pub snapshot_path: String,
pub snapshot_mode: String,
pub container_name: String,
pub image: String,
pub workdir: String,
#[serde(default)]
pub network: Option<String>,
#[serde(default)]
pub env: HashMap<String, String>,
#[serde(default)]
pub volumes: Vec<VolumeMount>,
#[serde(default)]
pub ports: Vec<String>,
pub command: Vec<String>,
#[serde(default)]
pub pre_install: Vec<String>,
#[serde(default)]
pub run: Vec<String>,
#[serde(default)]
pub services: Vec<String>,
#[serde(default)]
pub in_place: bool,
#[serde(default)]
pub task: Option<String>,
#[serde(default)]
pub exit_code: Option<i32>,
pub status: String,
}