openai_interface/rest/
delete.rs

1//! Delete request
2
3use std::str::FromStr;
4
5use serde::de::DeserializeOwned;
6
7use crate::errors::OapiError;
8
9pub trait Delete {
10    /// Returns the URL with query parameters
11    ///
12    /// Parameters:
13    /// - _base_url_: should look like https://api.openai.com/v1/ (must ends with '/')
14    fn build_url(&self, base_url: &str) -> Result<String, OapiError>;
15}
16
17pub trait DeleteNoStream: Delete + Send + Sync {
18    type Response: DeserializeOwned + FromStr<Err = OapiError> + Send + Sync;
19
20    fn get_response_string(
21        &self,
22        base_url: &str,
23        key: &str,
24    ) -> impl Future<Output = Result<String, OapiError>> + Send + Sync {
25        async move {
26            let url = self.build_url(base_url)?;
27
28            let client = reqwest::Client::new();
29            let response = client
30                .delete(url)
31                .header("Accept", "application/json")
32                .bearer_auth(key)
33                .send()
34                .await
35                .map_err(|e| {
36                    OapiError::SendError(format!("Failed to send DELETE request: {}", e))
37                })?;
38
39            if response.status() != reqwest::StatusCode::OK {
40                return Err(
41                    crate::errors::OapiError::ResponseStatus(response.status().as_u16()).into(),
42                );
43            }
44
45            let text = response.text().await.map_err(|e| {
46                OapiError::ResponseError(format!("Failed to get response text: {:#?}", e))
47            })?;
48
49            Ok(text)
50        }
51    }
52
53    fn get_response(
54        &self,
55        base_url: &str,
56        key: &str,
57    ) -> impl Future<Output = Result<Self::Response, OapiError>> + Send + Sync {
58        async move {
59            let text = self.get_response_string(base_url, key).await?;
60            let result = Self::Response::from_str(&text)?;
61            Ok(result)
62        }
63    }
64}