use derive_setters::Setters;
use serde::{Deserialize, Serialize};
use crate::env::Env;
#[derive(Debug, Setters, Serialize, Deserialize, Clone, Default, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
#[setters(strip_option, into)]
pub struct Container {
pub image: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub credentials: Option<Credentials>,
#[serde(skip_serializing_if = "Option::is_none")]
pub env: Option<Env>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ports: Option<Vec<Port>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub volumes: Option<Vec<Volume>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hostname: Option<String>,
}
#[derive(Debug, Setters, Serialize, Deserialize, Clone, Default, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
#[setters(strip_option, into)]
pub struct Credentials {
pub username: String,
pub password: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
#[serde(untagged)]
pub enum Port {
Number(u16),
Name(String),
}
#[derive(Debug, Setters, Serialize, Deserialize, Clone, Default, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
#[setters(strip_option, into)]
pub struct Volume {
pub source: String,
pub destination: String,
}
impl Volume {
pub fn new(volume_str: &str) -> Option<Self> {
let parts: Vec<&str> = volume_str.split(':').collect();
if parts.len() == 2 {
Some(Self {
source: parts[0].to_string(),
destination: parts[1].to_string(),
})
} else {
None
}
}
}