use reqwest::Method;
use serde::{Deserialize, Serialize};
use serde_json::json;
use crate::{Body, Client, Error, Result};
fn parse<T: serde::de::DeserializeOwned>(text: &str) -> Result<T> {
serde_json::from_str(text).map_err(|error| Error::Protocol(error.to_string()))
}
pub async fn set_name(client: &Client, name: &str) -> Result<()> {
client.rest(Method::PATCH, "/v1/account", Some(Body::Json(json!({ "display_name": name })))).await?;
Ok(())
}
#[derive(Debug, Clone, Deserialize)]
pub struct Language {
pub language: Option<String>,
pub used: String,
pub available: Vec<String>,
}
pub async fn language(client: &Client) -> Result<Language> {
parse(&client.rest(Method::GET, "/v1/account/language", None).await?)
}
pub async fn set_language(client: &Client, language: Option<&str>) -> Result<()> {
client.rest(Method::PUT, "/v1/account/language", Some(Body::Json(json!({ "language": language })))).await?;
Ok(())
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Deserialize, Serialize)]
pub struct MailSettings {
pub trash_retention_days: Option<i32>,
#[serde(default, skip_serializing)]
pub tenant_trash_retention_days: Option<i32>,
pub default_from: Option<String>,
pub undo_send_seconds: i32,
}
pub async fn mail_settings(client: &Client) -> Result<MailSettings> {
parse(&client.rest(Method::GET, "/v1/account/mail-settings", None).await?)
}
pub async fn set_mail_settings(client: &Client, settings: &MailSettings) -> Result<()> {
let body = serde_json::to_value(settings).map_err(|error| Error::Protocol(error.to_string()))?;
client.rest(Method::PUT, "/v1/account/mail-settings", Some(Body::Json(body))).await?;
Ok(())
}
pub async fn set_avatar(client: &Client, image: Vec<u8>, media_type: &str) -> Result<()> {
client.rest(Method::PUT, "/v1/account/avatar", Some(Body::Bytes(image, media_type.to_owned()))).await?;
Ok(())
}
pub async fn remove_avatar(client: &Client) -> Result<()> {
client.rest(Method::DELETE, "/v1/account/avatar", None).await?;
Ok(())
}
pub async fn avatar(client: &Client, account: &str) -> Result<Option<Vec<u8>>> {
match client.rest_bytes(&format!("/v1/avatars/{}", crate::encode(account))).await {
Ok(bytes) => Ok(Some(bytes)),
Err(Error::Status(404, _)) => Ok(None),
Err(error) => Err(error),
}
}