1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5fn serialize_as_json<T, S>(t: &T, s: S) -> Result<S::Ok, S::Error>
6where
7 T: Serialize,
8 S: serde::Serializer,
9{
10 s.serialize_str(&serde_json::to_string(t).map_err(|e| serde::ser::Error::custom(format!("{e}")))?)
11}
12
13#[derive(Debug, Clone, Default, PartialEq, Serialize)]
14pub struct ListContainersOptions {
15 pub all: bool,
17 pub limit: Option<isize>,
19 pub size: bool,
21
22 #[serde(serialize_with = "serialize_as_json")]
25 pub filters: HashMap<String, Vec<String>>,
26}
27
28#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
29pub struct ContainerSummary {
30 #[serde(rename = "Id")]
32 #[serde(skip_serializing_if = "Option::is_none")]
33 pub id: Option<String>,
34
35 #[serde(rename = "Names")]
37 #[serde(skip_serializing_if = "Option::is_none")]
38 pub names: Option<Vec<String>>,
39
40 #[serde(rename = "Image")]
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub image: Option<String>,
44
45 #[serde(rename = "ImageID")]
47 #[serde(skip_serializing_if = "Option::is_none")]
48 pub image_id: Option<String>,
49
50 #[serde(rename = "Command")]
52 #[serde(skip_serializing_if = "Option::is_none")]
53 pub command: Option<String>,
54
55 #[serde(rename = "Created")]
57 #[serde(skip_serializing_if = "Option::is_none")]
58 pub created: Option<i64>,
59
60 #[serde(rename = "Ports")]
62 #[serde(skip_serializing_if = "Option::is_none")]
63 pub ports: Option<Vec<Port>>,
64
65 #[serde(rename = "SizeRw")]
67 #[serde(skip_serializing_if = "Option::is_none")]
68 pub size_rw: Option<i64>,
69
70 #[serde(rename = "SizeRootFs")]
72 #[serde(skip_serializing_if = "Option::is_none")]
73 pub size_root_fs: Option<i64>,
74
75 #[serde(rename = "Labels")]
77 #[serde(skip_serializing_if = "Option::is_none")]
78 pub labels: Option<HashMap<String, String>>,
79
80 #[serde(rename = "State")]
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub state: Option<String>,
84
85 #[serde(rename = "Status")]
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub status: Option<String>,
89
90 #[serde(rename = "HostConfig")]
91 #[serde(skip_serializing_if = "Option::is_none")]
92 pub host_config: Option<ContainerSummaryHostConfig>,
93
94 #[serde(rename = "NetworkSettings")]
95 #[serde(skip_serializing_if = "Option::is_none")]
96 pub network_settings: Option<ContainerSummaryNetworkSettings>,
97
98 #[serde(rename = "Mounts")]
99 #[serde(skip_serializing_if = "Option::is_none")]
100 pub mounts: Option<Vec<MountPoint>>,
101}
102
103#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
104pub struct ContainerSummaryHostConfig {
105 #[serde(rename = "NetworkMode")]
106 #[serde(skip_serializing_if = "Option::is_none")]
107 pub network_mode: Option<String>,
108}
109
110#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
112pub struct ContainerSummaryNetworkSettings {
113 #[serde(rename = "Networks")]
114 #[serde(skip_serializing_if = "Option::is_none")]
115 pub networks: Option<HashMap<String, EndpointSettings>>,
116}
117
118#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
120pub struct Port {
121 #[serde(rename = "IP")]
123 #[serde(skip_serializing_if = "Option::is_none")]
124 pub ip: Option<String>,
125
126 #[serde(rename = "PrivatePort")]
128 pub private_port: u16,
129
130 #[serde(rename = "PublicPort")]
132 #[serde(skip_serializing_if = "Option::is_none")]
133 pub public_port: Option<u16>,
134
135 #[serde(rename = "Type")]
136 #[serde(skip_serializing_if = "Option::is_none")]
137 pub typ: Option<PortTypeEnum>,
139}
140
141#[allow(non_camel_case_types)]
142#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize, Eq, Ord)]
143pub enum PortTypeEnum {
144 #[serde(rename = "")]
145 EMPTY,
146 #[serde(rename = "tcp")]
147 TCP,
148 #[serde(rename = "udp")]
149 UDP,
150 #[serde(rename = "sctp")]
151 SCTP,
152}
153
154impl ::std::fmt::Display for PortTypeEnum {
155 fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
156 match *self {
157 PortTypeEnum::EMPTY => write!(f, ""),
158 PortTypeEnum::TCP => write!(f, "{}", "tcp"),
159 PortTypeEnum::UDP => write!(f, "{}", "udp"),
160 PortTypeEnum::SCTP => write!(f, "{}", "sctp"),
161 }
162 }
163}
164
165impl ::std::str::FromStr for PortTypeEnum {
166 type Err = String;
167 fn from_str(s: &str) -> Result<Self, Self::Err> {
168 match s {
169 "" => Ok(PortTypeEnum::EMPTY),
170 "tcp" => Ok(PortTypeEnum::TCP),
171 "udp" => Ok(PortTypeEnum::UDP),
172 "sctp" => Ok(PortTypeEnum::SCTP),
173 x => Err(format!("Invalid enum type: {}", x)),
174 }
175 }
176}
177
178impl ::std::convert::AsRef<str> for PortTypeEnum {
179 fn as_ref(&self) -> &str {
180 match self {
181 PortTypeEnum::EMPTY => "",
182 PortTypeEnum::TCP => "tcp",
183 PortTypeEnum::UDP => "udp",
184 PortTypeEnum::SCTP => "sctp",
185 }
186 }
187}
188
189#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
191pub struct EndpointSettings {
192 #[serde(rename = "IPAMConfig")]
193 #[serde(skip_serializing_if = "Option::is_none")]
194 pub ipam_config: Option<EndpointIpamConfig>,
195
196 #[serde(rename = "Links")]
197 #[serde(skip_serializing_if = "Option::is_none")]
198 pub links: Option<Vec<String>>,
199
200 #[serde(rename = "MacAddress")]
202 #[serde(skip_serializing_if = "Option::is_none")]
203 pub mac_address: Option<String>,
204
205 #[serde(rename = "Aliases")]
206 #[serde(skip_serializing_if = "Option::is_none")]
207 pub aliases: Option<Vec<String>>,
208
209 #[serde(rename = "NetworkID")]
211 #[serde(skip_serializing_if = "Option::is_none")]
212 pub network_id: Option<String>,
213
214 #[serde(rename = "EndpointID")]
216 #[serde(skip_serializing_if = "Option::is_none")]
217 pub endpoint_id: Option<String>,
218
219 #[serde(rename = "Gateway")]
221 #[serde(skip_serializing_if = "Option::is_none")]
222 pub gateway: Option<String>,
223
224 #[serde(rename = "IPAddress")]
226 #[serde(skip_serializing_if = "Option::is_none")]
227 pub ip_address: Option<String>,
228
229 #[serde(rename = "IPPrefixLen")]
231 #[serde(skip_serializing_if = "Option::is_none")]
232 pub ip_prefix_len: Option<i64>,
233
234 #[serde(rename = "IPv6Gateway")]
236 #[serde(skip_serializing_if = "Option::is_none")]
237 pub ipv6_gateway: Option<String>,
238
239 #[serde(rename = "GlobalIPv6Address")]
241 #[serde(skip_serializing_if = "Option::is_none")]
242 pub global_ipv6_address: Option<String>,
243
244 #[serde(rename = "GlobalIPv6PrefixLen")]
246 #[serde(skip_serializing_if = "Option::is_none")]
247 pub global_ipv6_prefix_len: Option<i64>,
248
249 #[serde(rename = "DriverOpts")]
251 #[serde(skip_serializing_if = "Option::is_none")]
252 pub driver_opts: Option<HashMap<String, String>>,
253
254 #[serde(rename = "DNSNames")]
256 #[serde(skip_serializing_if = "Option::is_none")]
257 pub dns_names: Option<Vec<String>>,
258}
259
260#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
262pub struct MountPoint {
263 #[serde(rename = "Type")]
265 #[serde(skip_serializing_if = "Option::is_none")]
266 pub typ: Option<MountPointTypeEnum>,
267
268 #[serde(rename = "Name")]
270 #[serde(skip_serializing_if = "Option::is_none")]
271 pub name: Option<String>,
272
273 #[serde(rename = "Source")]
275 #[serde(skip_serializing_if = "Option::is_none")]
276 pub source: Option<String>,
277
278 #[serde(rename = "Destination")]
280 #[serde(skip_serializing_if = "Option::is_none")]
281 pub destination: Option<String>,
282
283 #[serde(rename = "Driver")]
285 #[serde(skip_serializing_if = "Option::is_none")]
286 pub driver: Option<String>,
287
288 #[serde(rename = "Mode")]
290 #[serde(skip_serializing_if = "Option::is_none")]
291 pub mode: Option<String>,
292
293 #[serde(rename = "RW")]
295 #[serde(skip_serializing_if = "Option::is_none")]
296 pub rw: Option<bool>,
297
298 #[serde(rename = "Propagation")]
300 #[serde(skip_serializing_if = "Option::is_none")]
301 pub propagation: Option<String>,
302}
303
304#[allow(non_camel_case_types)]
305#[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Serialize, Deserialize, Eq, Ord)]
306pub enum MountPointTypeEnum {
307 #[serde(rename = "")]
308 EMPTY,
309 #[serde(rename = "bind")]
310 BIND,
311 #[serde(rename = "volume")]
312 VOLUME,
313 #[serde(rename = "tmpfs")]
314 TMPFS,
315 #[serde(rename = "npipe")]
316 NPIPE,
317 #[serde(rename = "cluster")]
318 CLUSTER,
319}
320
321impl ::std::fmt::Display for MountPointTypeEnum {
322 fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
323 match *self {
324 MountPointTypeEnum::EMPTY => write!(f, ""),
325 MountPointTypeEnum::BIND => write!(f, "{}", "bind"),
326 MountPointTypeEnum::VOLUME => write!(f, "{}", "volume"),
327 MountPointTypeEnum::TMPFS => write!(f, "{}", "tmpfs"),
328 MountPointTypeEnum::NPIPE => write!(f, "{}", "npipe"),
329 MountPointTypeEnum::CLUSTER => write!(f, "{}", "cluster"),
330 }
331 }
332}
333
334impl ::std::str::FromStr for MountPointTypeEnum {
335 type Err = String;
336 fn from_str(s: &str) -> Result<Self, Self::Err> {
337 match s {
338 "" => Ok(MountPointTypeEnum::EMPTY),
339 "bind" => Ok(MountPointTypeEnum::BIND),
340 "volume" => Ok(MountPointTypeEnum::VOLUME),
341 "tmpfs" => Ok(MountPointTypeEnum::TMPFS),
342 "npipe" => Ok(MountPointTypeEnum::NPIPE),
343 "cluster" => Ok(MountPointTypeEnum::CLUSTER),
344 x => Err(format!("Invalid enum type: {}", x)),
345 }
346 }
347}
348
349impl ::std::convert::AsRef<str> for MountPointTypeEnum {
350 fn as_ref(&self) -> &str {
351 match self {
352 MountPointTypeEnum::EMPTY => "",
353 MountPointTypeEnum::BIND => "bind",
354 MountPointTypeEnum::VOLUME => "volume",
355 MountPointTypeEnum::TMPFS => "tmpfs",
356 MountPointTypeEnum::NPIPE => "npipe",
357 MountPointTypeEnum::CLUSTER => "cluster",
358 }
359 }
360}
361
362#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
364pub struct EndpointIpamConfig {
365 #[serde(rename = "IPv4Address")]
366 #[serde(skip_serializing_if = "Option::is_none")]
367 pub ipv4_address: Option<String>,
368
369 #[serde(rename = "IPv6Address")]
370 #[serde(skip_serializing_if = "Option::is_none")]
371 pub ipv6_address: Option<String>,
372
373 #[serde(rename = "LinkLocalIPs")]
374 #[serde(skip_serializing_if = "Option::is_none")]
375 pub link_local_i_ps: Option<Vec<String>>,
376}