Skip to main content

dcd/composer/
types.rs

1use crate::composer::errors::ComposerError;
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4use std::path::PathBuf;
5
6pub type ComposerResult<T> = Result<T, ComposerError>;
7
8#[derive(Debug, Clone, Deserialize, Serialize)]
9pub struct ComposerVariables {
10    pub name: String,
11    pub required: bool,
12    pub default_value: Option<String>,
13    pub alternate_value: Option<String>,
14}
15
16#[derive(Debug, Clone, Deserialize, Serialize)]
17pub struct PortMapping {
18    pub mode: Option<String>,
19    pub target: u16,
20    pub published: String,
21    pub protocol: Option<String>,
22}
23
24#[derive(Debug, Clone, Deserialize, Serialize)]
25pub struct VolumeMapping {
26    pub r#type: String, // 'bind' or 'volume', or 'tmpfs'
27    pub source: Option<String>,
28    pub target: String,
29    pub read_only: Option<bool>,
30}
31
32#[derive(Debug, Clone, Deserialize)]
33pub struct Service {
34    pub container_name: Option<String>,
35    pub image: Option<String>,
36    pub build: Option<BuildConfig>,
37    pub environment: Option<HashMap<String, String>>,
38    pub ports: Option<Vec<PortMapping>>,
39    pub volumes: Option<Vec<VolumeMapping>>,
40    pub configs: Option<Vec<ConfigReference>>,
41    #[serde(rename = "env_file")]
42    pub env_file: Option<EnvFiles>,
43    pub profiles: Option<Vec<String>>,
44}
45
46#[derive(Debug, Clone, Deserialize)]
47#[serde(untagged)]
48pub enum EnvFiles {
49    Single(String),
50    Multiple(Vec<String>),
51}
52
53#[derive(Debug, Clone, Deserialize)]
54pub struct ConfigReference {
55    pub source: Option<PathBuf>,
56    pub target: Option<PathBuf>,
57}
58
59#[derive(Debug, Clone, Deserialize)]
60pub struct BuildConfig {
61    pub context: PathBuf,
62    pub dockerfile: Option<PathBuf>,
63    pub args: Option<HashMap<String, String>>,
64}
65
66#[derive(Debug, Clone, Deserialize)]
67pub struct ComposeFile {
68    pub services: HashMap<String, Service>,
69    pub volumes: Option<HashMap<String, Volume>>,
70}
71
72#[derive(Debug, Clone, Deserialize)]
73pub struct Volume {
74    pub external: Option<bool>,
75    pub name: Option<String>,
76}
77
78#[derive(Debug, Clone)]
79pub struct ComposerConfig {
80    pub project_dir: PathBuf,
81    pub compose_files: Vec<PathBuf>,
82    pub env_files: Vec<PathBuf>,
83}
84
85#[derive(Debug, Clone)]
86pub struct ComposerOutput {
87    pub consumed_env: HashMap<String, String>,
88    pub missing_env: Vec<String>,
89    pub exposed_ports: Vec<PortMapping>,
90    pub volumes: Vec<VolumeMapping>,
91    pub local_references: Vec<PathBuf>,
92    pub resolved_compose_files: Vec<PathBuf>,
93    pub resolved_project_dir: PathBuf,
94    pub resolved_env_files: Vec<PathBuf>,
95    pub available_profiles: Vec<String>,
96    pub active_profiles: Vec<String>,
97}
98
99impl Default for ComposerOutput {
100    fn default() -> Self {
101        Self::new()
102    }
103}
104
105impl ComposerOutput {
106    pub fn new() -> Self {
107        Self {
108            consumed_env: HashMap::new(),
109            missing_env: Vec::new(),
110            exposed_ports: Vec::new(),
111            volumes: Vec::new(),
112            local_references: Vec::new(),
113            resolved_compose_files: Vec::new(),
114            resolved_project_dir: PathBuf::new(),
115            resolved_env_files: Vec::new(),
116            available_profiles: Vec::new(),
117            active_profiles: Vec::new(),
118        }
119    }
120}