use url::Url;
use crate::{
errors::OapiError,
rest::get::{Get, GetNoStream},
};
#[derive(Debug, Clone, Default)]
pub struct ListFilesRequest {
pub after: Option<String>,
pub limit: Option<u32>,
pub order: Option<ListOrder>,
pub purpose: Option<String>,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum ListOrder {
Asc,
#[default]
Desc,
}
impl ListOrder {
fn as_str(self) -> &'static str {
match self {
ListOrder::Asc => "asc",
ListOrder::Desc => "desc",
}
}
}
impl Get for ListFilesRequest {
#[allow(rustdoc::bare_urls)]
fn build_url(&self, base_url: &str) -> Result<String, OapiError> {
let mut url = Url::parse(base_url.trim_end_matches('/')).map_err(OapiError::UrlError)?;
url.path_segments_mut()
.map_err(|_| OapiError::UrlCannotBeBase(base_url.to_string()))?
.push("files");
if self.purpose.is_some()
|| self.limit.is_some()
|| self.after.is_some()
|| self.order.is_some()
{
let mut query_pairs = url.query_pairs_mut();
if let Some(ref purpose) = self.purpose {
query_pairs.append_pair("purpose", purpose);
}
if let Some(limit) = self.limit {
query_pairs.append_pair("limit", &limit.to_string());
}
if let Some(order) = self.order {
query_pairs.append_pair("order", order.as_str());
}
if let Some(ref after) = self.after {
query_pairs.append_pair("after", after);
}
}
Ok(url.to_string())
}
}
impl GetNoStream for ListFilesRequest {
type Response = super::response::ListFilesResponse;
}