1use crate::{
4 conn::{Headers, Payload},
5 models, Result,
6};
7
8impl_api_ty!(Secret => name);
9
10impl Secret {
11 impl_api_ep! { secret: Secret, resp
12 Inspect -> &format!("/secrets/{}", secret.name), models::Secret
13 Delete -> &format!("/secrets/{}", secret.name), ()
14 }
15 }
17
18impl Secrets {
19 impl_api_ep! { __: Secret, resp
20 List -> "/secrets", models::Secret
21 }
22
23 api_doc! { Secret => Create
24 |
25 pub async fn create(&self, opts: &SecretCreateOpts) -> Result<Secret> {
27 use serde::Deserialize;
28 #[derive(Deserialize)]
29 struct SecretCreateResponse {
30 #[serde(rename = "Id")]
31 pub id: String,
32 }
33 self.docker
34 .post_json("/secrets/create", Payload::Json(opts.serialize_vec()?), Headers::none())
35 .await
36 .map(|resp: SecretCreateResponse| {
37 Secret::new(self.docker.clone(), resp.id)
38 })
39 }}
40}
41
42pub mod opts {
43 use crate::models::{Driver, Labels};
44 use crate::{Error, Result};
45 use containers_api::opts::{Filter, FilterItem};
46 use containers_api::{impl_filter_func, impl_opts_builder};
47 use serde::{Deserialize, Serialize};
48
49 impl_opts_builder!(url => SecretList);
50
51 pub enum SecretFilter {
52 Id(String),
54 LabelKey(String),
56 Label(String, String),
58 Name(String),
60 Names(String),
61 }
62
63 impl Filter for SecretFilter {
64 fn query_item(&self) -> FilterItem {
65 use SecretFilter::*;
66 match &self {
67 Id(id) => FilterItem::new("id", id.to_owned()),
68 LabelKey(label) => FilterItem::new("label", label.to_owned()),
69 Label(key, val) => FilterItem::new("label", format!("{key}={val}")),
70 Name(name) => FilterItem::new("name", name.to_owned()),
71 Names(names) => FilterItem::new("names", names.to_owned()),
72 }
73 }
74 }
75
76 impl SecretListOptsBuilder {
77 impl_filter_func!(
78 SecretFilter
80 );
81 }
82
83 #[derive(Clone, Debug, Serialize, Deserialize)]
84 #[serde(rename_all = "PascalCase")]
85 pub struct SecretCreateOpts {
87 name: String,
88 labels: Labels,
89 data: String,
90 driver: Driver,
91 templating: Driver,
92 }
93
94 impl SecretCreateOpts {
95 pub fn new<N, D>(name: N, data: D) -> Self
98 where
99 N: Into<String>,
100 D: AsRef<str>,
101 {
102 Self {
103 name: name.into(),
104 labels: Labels::new(),
105 data: base64::encode(data.as_ref()),
106 driver: Driver {
107 name: "".into(),
108 options: None,
109 },
110 templating: Driver {
111 name: "".into(),
112 options: None,
113 },
114 }
115 }
116
117 pub fn set_driver(mut self, driver: Driver) -> Self {
119 self.driver = driver;
120 self
121 }
122
123 pub fn set_templating(mut self, driver: Driver) -> Self {
125 self.templating = driver;
126 self
127 }
128
129 pub fn add_label<K, V>(mut self, key: K, val: V) -> Self
131 where
132 K: Into<String>,
133 V: Into<String>,
134 {
135 self.labels.insert(key.into(), val.into());
136 self
137 }
138
139 pub fn serialize(&self) -> Result<String> {
140 serde_json::to_string(&self).map_err(Error::from)
141 }
142
143 pub fn serialize_vec(&self) -> Result<Vec<u8>> {
144 serde_json::to_vec(&self).map_err(Error::from)
145 }
146 }
147}
148
149pub use opts::*;