openwhisk_client_rust/api/
trigger.rs1use super::NAMESPACE_ENDPOINT;
2use super::{HttpMethods, Limits, Service, TRIGGERS_ENDPOINT};
3use crate::client::Context;
4use derive_new::new;
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7
8#[derive(new, Default, Debug, Clone)]
10pub struct TriggerService<T> {
11 client: T,
13 context: Context,
15}
16
17#[derive(Debug, Deserialize, Serialize, Clone, Default)]
19pub struct Trigger {
20 #[serde(default)]
22 pub namespace: String,
23 #[serde(default)]
25 pub name: String,
26 pub version: String,
28 #[serde(default)]
30 pub publish: bool,
31 #[serde(default)]
33 pub updated: i64,
34 pub annotations: Vec<KeyValue>,
36 #[serde(default)]
38 pub parameters: Vec<KeyValue>,
39 #[serde(default)]
41 #[serde(skip_serializing)]
42 pub limits: Limits,
43}
44
45#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
46pub struct KeyValue {
47 pub key: String,
48 pub value: Value,
49}
50#[derive(Debug, Deserialize, Serialize, Clone)]
51pub struct TriggerListOptions {
52 pub limit: i64,
54 pub skip: i64,
56 pub docs: bool,
58}
59
60impl<T> TriggerService<T>
61where
62 T: Service,
63{
64 pub fn list(&self) -> Result<Vec<Trigger>, String> {
66 let url = format!(
67 "{}/api/v1/{}/{}/{}",
68 self.context.host(),
69 NAMESPACE_ENDPOINT,
70 self.context.namespace(),
71 TRIGGERS_ENDPOINT
72 );
73
74 let user_auth = self.context.auth();
75 let user = user_auth.0;
76 let pass = user_auth.1;
77
78 let request = match self.client.new_request(
79 Some(HttpMethods::GET),
80 url.as_str(),
81 Some((user, pass)),
82 None,
83 ) {
84 Ok(request) => request,
85 Err(error) => return Err(error),
86 };
87
88 match self.client.invoke_request(request) {
89 Ok(value) => match serde_json::from_value(value) {
90 Ok(result) => Ok(result),
91 Err(error) => Err(format!("Failed deserailize triggers {}", error)),
92 },
93
94 Err(error) => Err(format!("Failed to fetch the list of triggers {}", error)),
95 }
96 }
97
98 pub fn insert(&self, trigger: &Trigger, overwrite: bool) -> Result<Trigger, String> {
105 let url = format!(
106 "{}/api/v1/{}/{}/{}/{}?overwrite={}",
107 self.context.host(),
108 NAMESPACE_ENDPOINT,
109 self.context.namespace(),
110 TRIGGERS_ENDPOINT,
111 trigger.name,
112 overwrite,
113 );
114
115 let user_auth = self.context.auth();
116 let user = user_auth.0;
117 let pass = user_auth.1;
118
119 let body = match serde_json::to_value(trigger) {
120 Ok(value) => value,
121 Err(err) => return Err(format!("failed to serialize body {}", err)),
122 };
123
124 let request = match self.client.new_request(
125 Some(HttpMethods::PUT),
126 url.as_str(),
127 Some((user, pass)),
128 Some(body),
129 ) {
130 Ok(request) => request,
131 Err(err) => return Err(format!("failed to create request {}", err)),
132 };
133
134 let trigger: Trigger = match self.client.invoke_request(request) {
135 Ok(response) => match serde_json::from_value(response) {
136 Ok(trigger) => trigger,
137 Err(err) => return Err(format!("falied to deserilaize {}", err)),
138 },
139 Err(err) => return Err(format!("falied to insert trigger {}", err)),
140 };
141
142 Ok(trigger)
143 }
144
145 pub fn get(&self, trigger_name: &str) -> Result<Trigger, String> {
151 let url = format!(
152 "{}/api/v1/{}/{}/{}/{}",
153 self.context.host(),
154 NAMESPACE_ENDPOINT,
155 self.context.namespace(),
156 TRIGGERS_ENDPOINT,
157 trigger_name
158 );
159
160 let user_auth = self.context.auth();
161 let user = user_auth.0;
162 let pass = user_auth.1;
163
164 let request = match self.client.new_request(
165 Some(HttpMethods::GET),
166 url.as_str(),
167 Some((user, pass)),
168 None,
169 ) {
170 Ok(request) => request,
171 Err(err) => return Err(err),
172 };
173
174 let trigger: Trigger = match self.client.invoke_request(request) {
175 Ok(response) => match serde_json::from_value(response) {
176 Ok(trigger) => trigger,
177 Err(err) => return Err(format!("falied to deserilaize {}", err)),
178 },
179 Err(err) => return Err(format!("falied to insert trigger {}", err)),
180 };
181
182 Ok(trigger)
183 }
184
185 pub fn delete(&self, trigger_name: &str) -> Result<Trigger, String> {
190 let url = format!(
191 "{}/api/v1/{}/{}/{}/{}",
192 self.context.host(),
193 NAMESPACE_ENDPOINT,
194 self.context.namespace(),
195 TRIGGERS_ENDPOINT,
196 trigger_name
197 );
198 let user_auth = self.context.auth();
199 let user = user_auth.0;
200 let pass = user_auth.1;
201
202 let request = match self.client.new_request(
203 Some(HttpMethods::DELETE),
204 url.as_str(),
205 Some((user, pass)),
206 None,
207 ) {
208 Ok(request) => request,
209 Err(err) => return Err(err),
210 };
211
212 let trigger: Trigger = match self.client.invoke_request(request) {
213 Ok(response) => match serde_json::from_value(response) {
214 Ok(trigger) => trigger,
215 Err(err) => return Err(format!("falied to deserilaize {}", err)),
216 },
217 Err(err) => return Err(format!("falied to insert trigger {}", err)),
218 };
219
220 Ok(trigger)
221 }
222
223 pub fn fire(&self, trigger_name: &str, payload: Value) -> Result<Trigger, String> {
230 let url = format!(
231 "{}/api/v1/{}/{}/{}/{}",
232 self.context.host(),
233 NAMESPACE_ENDPOINT,
234 self.context.namespace(),
235 TRIGGERS_ENDPOINT,
236 trigger_name
237 );
238
239 let user_auth = self.context.auth();
240 let user = user_auth.0;
241 let pass = user_auth.1;
242
243 let request = match self.client.new_request(
244 Some(HttpMethods::POST),
245 url.as_str(),
246 Some((user, pass)),
247 Some(payload),
248 ) {
249 Ok(request) => request,
250 Err(err) => return Err(err),
251 };
252
253 let trigger: Trigger = match self.client.invoke_request(request) {
254 Ok(response) => match serde_json::from_value(response) {
255 Ok(trigger) => trigger,
256 Err(err) => return Err(format!("falied to deserilaize {}", err)),
257 },
258 Err(err) => return Err(format!("falied to insert trigger {}", err)),
259 };
260
261 Ok(trigger)
262 }
263}