Skip to main content

rclone_sdk/
overrides.rs

1//! Hand-written overrides for the generated client. Survives regeneration; the
2//! gen script wires it in via `pub mod overrides;`.
3
4use crate::types;
5use crate::Client;
6use progenitor_client::{Error, ResponseValue};
7
8/// Interactive step from `config/create` / `config/update` (with `opt.nonInteractive`).
9#[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/// Job handle from an async submission (poll `job/status` with `jobid`).
24#[derive(::serde::Serialize, ::serde::Deserialize, Debug, Clone, Default)]
25pub struct AsyncJob {
26    pub jobid: i64,
27}
28
29impl Client {
30    /// Typed `config/create` (use with `opt.nonInteractive=true`); preserves the
31    /// interactive step fields the generated method drops.
32    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    /// Typed `config/update` counterpart of [`Client::config_create_step`].
44    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    /// Submit any RC operation asynchronously (sets `_async=true` +
94    /// `Prefer: respond-async`). Rust analog of the TS `ASYNC`.
95    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}