podman_client/images/
create.rs1use 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}