use std::fmt::{self, Debug, Display};
use reqwest::{Method, Url};
use serde::Deserialize;
use crate::ucare::{rest::Client, IntoUrlQuery, Result};
pub struct Service<'a> {
client: &'a Client,
}
pub fn new_svc(client: &Client) -> Service {
Service { client }
}
impl Service<'_> {
pub fn info(&self, group_id: &str) -> Result<Info> {
self.client.call::<String, String, Info>(
Method::GET,
format!("/groups/{}/", group_id),
None,
None,
)
}
pub fn list(&self, params: ListParams) -> Result<List> {
self.client.call::<ListParams, String, List>(
Method::GET,
format!("/groups/"),
Some(params),
None,
)
}
pub fn get_page(&self, url: &str) -> Result<List> {
let url = Url::parse(url)?;
self.client.call_url::<String, List>(Method::GET, url, None)
}
pub fn store(&self, group_id: &str) -> Result<Info> {
self.client.call::<String, String, Info>(
Method::PUT,
format!("/groups/{}/storage/", group_id),
None,
None,
)
}
}
#[derive(Debug, Deserialize)]
pub struct Info {
pub id: String,
pub datetime_created: Option<String>,
pub datetime_stored: Option<String>,
pub files_count: i32,
pub cdn_url: String,
}
pub struct ListParams {
pub limit: Option<i32>,
pub ordering: Option<Ordering>,
pub from: Option<String>,
}
pub enum Ordering {
CreatedAtAsc,
CreatedAtDesc,
}
impl Display for Ordering {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let val = match *self {
Ordering::CreatedAtAsc => "datetime_created",
Ordering::CreatedAtDesc => "-datetime_created",
};
write!(f, "{}", val)
}
}
impl IntoUrlQuery for ListParams {
fn into_query(self) -> String {
let mut q = String::new();
q.push_str("limit=");
if let Some(val) = self.limit {
q.push_str(val.to_string().as_str());
} else {
q.push_str("100");
}
q.push('&');
q.push_str("ordering=");
if let Some(val) = self.ordering {
q.push_str(val.to_string().as_str());
} else {
q.push_str(Ordering::CreatedAtAsc.to_string().as_str());
}
if let Some(val) = self.from {
q.push('&');
q.push_str("from=");
q.push_str(val.as_str());
}
q
}
}
#[derive(Debug, Deserialize)]
pub struct List {
pub results: Option<Vec<Info>>,
pub next: Option<String>,
pub previous: Option<String>,
pub total: Option<f32>,
pub per_page: Option<f32>,
}