1use crate::types;
5use crate::Client;
6use progenitor_client::{Error, ResponseValue};
7
8#[derive(::serde::Serialize, ::serde::Deserialize, Debug, Clone, Default)]
10pub struct ConfigStep {
11 #[serde(rename = "State", default, skip_serializing_if = "Option::is_none")]
12 pub state: Option<String>,
13 #[serde(rename = "Option", default, skip_serializing_if = "Option::is_none")]
14 pub option: Option<::serde_json::Value>,
15 #[serde(rename = "Error", default, skip_serializing_if = "Option::is_none")]
16 pub error: Option<String>,
17 #[serde(rename = "Result", default, skip_serializing_if = "Option::is_none")]
18 pub result: Option<String>,
19 #[serde(flatten)]
20 pub extra: ::serde_json::Map<String, ::serde_json::Value>,
21}
22
23#[derive(::serde::Serialize, ::serde::Deserialize, Debug, Clone, Default)]
25pub struct AsyncJob {
26 pub jobid: i64,
27}
28
29impl Client {
30 pub async fn config_create_step<'a>(
33 &'a self,
34 name: Option<&'a str>,
35 type_: Option<&'a str>,
36 opt: Option<&'a str>,
37 parameters: Option<&'a str>,
38 ) -> Result<ResponseValue<ConfigStep>, Error<types::RcError>> {
39 self.config_step("config/create", name, type_, opt, parameters)
40 .await
41 }
42
43 pub async fn config_update_step<'a>(
45 &'a self,
46 name: Option<&'a str>,
47 opt: Option<&'a str>,
48 parameters: Option<&'a str>,
49 ) -> Result<ResponseValue<ConfigStep>, Error<types::RcError>> {
50 self.config_step("config/update", name, None, opt, parameters)
51 .await
52 }
53
54 async fn config_step<'a>(
55 &'a self,
56 path: &'a str,
57 name: Option<&'a str>,
58 type_: Option<&'a str>,
59 opt: Option<&'a str>,
60 parameters: Option<&'a str>,
61 ) -> Result<ResponseValue<ConfigStep>, Error<types::RcError>> {
62 let url = format!("{}/{}", self.baseurl, path);
63 let mut query: Vec<(&str, &str)> = Vec::new();
64 if let Some(v) = name {
65 query.push(("name", v));
66 }
67 if let Some(v) = type_ {
68 query.push(("type", v));
69 }
70 if let Some(v) = opt {
71 query.push(("opt", v));
72 }
73 if let Some(v) = parameters {
74 query.push(("parameters", v));
75 }
76 let response = self
77 .client
78 .post(url)
79 .header(::reqwest::header::ACCEPT, "application/json")
80 .json(&::serde_json::json!({}))
81 .query(&query)
82 .send()
83 .await?;
84 match response.status().as_u16() {
85 200 => ResponseValue::from_response(response).await,
86 400..=599 => Err(Error::ErrorResponse(
87 ResponseValue::from_response(response).await?,
88 )),
89 _ => Err(Error::UnexpectedResponse(response)),
90 }
91 }
92
93 pub async fn post_async<'a>(
96 &'a self,
97 path: &'a str,
98 query: &'a [(&'a str, &'a str)],
99 body: &'a ::serde_json::Value,
100 ) -> Result<ResponseValue<AsyncJob>, Error<types::RcError>> {
101 let url = format!("{}/{}", self.baseurl, path.trim_start_matches('/'));
102 let mut q: Vec<(&str, &str)> = query.to_vec();
103 q.push(("_async", "true"));
104 let response = self
105 .client
106 .post(url)
107 .header(::reqwest::header::ACCEPT, "application/json")
108 .header("Prefer", "respond-async")
109 .json(body)
110 .query(&q)
111 .send()
112 .await?;
113 match response.status().as_u16() {
114 200 | 202 => ResponseValue::from_response(response).await,
115 400..=599 => Err(Error::ErrorResponse(
116 ResponseValue::from_response(response).await?,
117 )),
118 _ => Err(Error::UnexpectedResponse(response)),
119 }
120 }
121}