podman_client/images/
create.rs

1use std::collections::HashMap;
2
3use http_body_util::Empty;
4use hyper::body::Bytes;
5use url::form_urlencoded;
6
7use crate::{
8    client::Client,
9    models::{
10        connection::SendRequestOptions,
11        lib::Error,
12        podman::images::create::{ImageCreate, ImageCreateOptions},
13    },
14    utils::bool_to_str::bool_to_str,
15};
16
17impl Client {
18    pub async fn image_create(
19        &self,
20        options: Option<ImageCreateOptions<'_>>,
21    ) -> Result<ImageCreate, Error> {
22        let mut path = "/libpod/build".to_owned();
23        let mut header = None;
24
25        if let Some(options) = options {
26            let mut query = form_urlencoded::Serializer::new(String::new());
27            if let Some(all_platforms) = options.all_platforms {
28                query.append_pair("allplatforms", bool_to_str(all_platforms));
29            }
30            if let Some(build_args) = options.build_args {
31                query.append_pair("buildargs", build_args);
32            }
33            if let Some(cache_from) = options.cache_from {
34                query.append_pair("cachefrom", cache_from);
35            }
36            if let Some(compat_volumes) = options.compat_volumes {
37                query.append_pair("compatvolumes", bool_to_str(compat_volumes));
38            }
39            if let Some(cpu_period) = options.cpu_period {
40                query.append_pair("cpuperiod", itoa::Buffer::new().format(cpu_period));
41            }
42            if let Some(cpu_quota) = options.cpu_quota {
43                query.append_pair("cpuquota", itoa::Buffer::new().format(cpu_quota));
44            }
45            if let Some(cpu_set_cpus) = options.cpu_set_cpus {
46                query.append_pair("cpusetcpus", cpu_set_cpus);
47            }
48            if let Some(cpu_shares) = options.cpu_shares {
49                query.append_pair("cpushares", itoa::Buffer::new().format(cpu_shares));
50            }
51            if let Some(dockerfile) = options.dockerfile {
52                query.append_pair("dockerfile", dockerfile);
53            }
54            if let Some(extra_hosts) = options.extra_hosts {
55                query.append_pair("extrahosts", extra_hosts);
56            }
57            if let Some(force_rm) = options.force_rm {
58                query.append_pair("forcerm", bool_to_str(force_rm));
59            }
60            if let Some(http_proxy) = options.http_proxy {
61                query.append_pair("httpproxy", bool_to_str(http_proxy));
62            }
63            if let Some(inherit_labels) = options.inherit_labels {
64                query.append_pair("inheritlabels", bool_to_str(inherit_labels));
65            }
66            if let Some(labels) = options.labels {
67                query.append_pair("labels", labels);
68            }
69            if let Some(layer_labels) = options.layer_label {
70                for layer_label in layer_labels {
71                    query.append_pair("layerLabel", layer_label);
72                }
73            }
74            if let Some(layers) = options.layers {
75                query.append_pair("layers", bool_to_str(layers));
76            }
77            if let Some(memory) = options.memory {
78                query.append_pair("memory", itoa::Buffer::new().format(memory));
79            }
80            if let Some(mem_swap) = options.mem_swap {
81                query.append_pair("memswap", itoa::Buffer::new().format(mem_swap));
82            }
83            if let Some(network_mode) = options.network_mode {
84                query.append_pair("networkmode", network_mode);
85            }
86            if let Some(no_cache) = options.no_cache {
87                query.append_pair("nocache", bool_to_str(no_cache));
88            }
89            if let Some(no_hosts) = options.no_hosts {
90                query.append_pair("nohosts", bool_to_str(no_hosts));
91            }
92            if let Some(outputs) = options.outputs {
93                query.append_pair("outputs", outputs);
94            }
95            if let Some(platform) = options.platform {
96                query.append_pair("platform", platform);
97            }
98            if let Some(pull) = options.pull {
99                query.append_pair("pull", bool_to_str(pull));
100            }
101            if let Some(q) = options.q {
102                query.append_pair("q", bool_to_str(q));
103            }
104            if let Some(remote) = options.remote {
105                query.append_pair("remote", remote);
106            }
107            if let Some(rm) = options.rm {
108                query.append_pair("rm", bool_to_str(rm));
109            }
110            if let Some(shm_size) = options.shm_size {
111                query.append_pair("shmsize", itoa::Buffer::new().format(shm_size));
112            }
113            if let Some(squash) = options.squash {
114                query.append_pair("squash", bool_to_str(squash));
115            }
116            if let Some(t) = options.t {
117                query.append_pair("t", t);
118            }
119            if let Some(target) = options.target {
120                query.append_pair("target", target);
121            }
122            if let Some(unset_envs) = options.unset_env {
123                for unset_env in unset_envs {
124                    query.append_pair("unsetenv", unset_env);
125                }
126            }
127            if let Some(unset_labels) = options.unset_label {
128                for unset_label in unset_labels {
129                    query.append_pair("unsetlabel", unset_label);
130                }
131            }
132            if let Some(volumes) = options.volume {
133                for volume in volumes {
134                    query.append_pair("volume", volume);
135                }
136            }
137            let query_string = query.finish();
138            if !query_string.is_empty() {
139                path += &["?", query_string.as_str()].concat();
140            }
141
142            let mut h = HashMap::new();
143            if let Some(content_type) = options.content_type {
144                h.insert("Content-Type", content_type);
145            }
146            if let Some(x_registry_config) = options.x_registry_config {
147                h.insert("X-Registry-Config", x_registry_config);
148            }
149            if !h.is_empty() {
150                header = Some(h);
151            }
152        }
153
154        let (_, data) = self
155            .send_request::<_, (), _>(SendRequestOptions {
156                method: "POST",
157                path: &path,
158                header,
159                body: Empty::<Bytes>::new(),
160            })
161            .await?;
162
163        Ok(data)
164    }
165}