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, 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}