1use derive_setters::Setters;
4use serde::{Deserialize, Serialize};
5
6use crate::env::Env;
7
8#[derive(Debug, Setters, Serialize, Deserialize, Clone, Default, PartialEq, Eq)]
10#[serde(rename_all = "kebab-case")]
11#[setters(strip_option, into)]
12pub struct Container {
13 pub image: String,
15
16 #[serde(skip_serializing_if = "Option::is_none")]
18 pub credentials: Option<Credentials>,
19
20 #[serde(skip_serializing_if = "Option::is_none")]
22 pub env: Option<Env>,
23
24 #[serde(skip_serializing_if = "Option::is_none")]
26 pub ports: Option<Vec<Port>>,
27
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub volumes: Option<Vec<Volume>>,
31
32 #[serde(skip_serializing_if = "Option::is_none")]
34 pub options: Option<String>,
35
36 #[serde(skip_serializing_if = "Option::is_none")]
38 pub hostname: Option<String>,
39}
40
41#[derive(Debug, Setters, Serialize, Deserialize, Clone, Default, PartialEq, Eq)]
43#[serde(rename_all = "kebab-case")]
44#[setters(strip_option, into)]
45pub struct Credentials {
46 pub username: String,
48
49 pub password: String,
51}
52
53#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]
55#[serde(rename_all = "kebab-case")]
56pub enum Port {
57 Number(u16),
59
60 Name(String),
62}
63
64#[derive(Debug, Setters, Serialize, Deserialize, Clone, Default, PartialEq, Eq)]
66#[serde(rename_all = "kebab-case")]
67#[setters(strip_option, into)]
68pub struct Volume {
69 pub source: String,
71
72 pub destination: String,
74}
75
76impl Volume {
77 pub fn new(volume_str: &str) -> Option<Self> {
79 let parts: Vec<&str> = volume_str.split(':').collect();
80 if parts.len() == 2 {
81 Some(Volume {
82 source: parts[0].to_string(),
83 destination: parts[1].to_string(),
84 })
85 } else {
86 None
87 }
88 }
89}