kernoid_client/
account.rs1use reqwest::Method;
7use serde::{Deserialize, Serialize};
8use serde_json::json;
9
10use crate::{Body, Client, Error, Result};
11
12fn parse<T: serde::de::DeserializeOwned>(text: &str) -> Result<T> {
13 serde_json::from_str(text).map_err(|error| Error::Protocol(error.to_string()))
14}
15
16pub async fn set_name(client: &Client, name: &str) -> Result<()> {
18 client.rest(Method::PATCH, "/v1/account", Some(Body::Json(json!({ "display_name": name })))).await?;
19 Ok(())
20}
21
22#[derive(Debug, Clone, Deserialize)]
24pub struct Language {
25 pub language: Option<String>,
27 pub used: String,
29 pub available: Vec<String>,
31}
32
33pub async fn language(client: &Client) -> Result<Language> {
34 parse(&client.rest(Method::GET, "/v1/account/language", None).await?)
35}
36
37pub async fn set_language(client: &Client, language: Option<&str>) -> Result<()> {
39 client.rest(Method::PUT, "/v1/account/language", Some(Body::Json(json!({ "language": language })))).await?;
40 Ok(())
41}
42
43#[derive(Debug, Clone, Default, PartialEq, Eq, Deserialize, Serialize)]
45pub struct MailSettings {
46 pub trash_retention_days: Option<i32>,
48 #[serde(default, skip_serializing)]
50 pub tenant_trash_retention_days: Option<i32>,
51 pub default_from: Option<String>,
53 pub undo_send_seconds: i32,
55}
56
57pub async fn mail_settings(client: &Client) -> Result<MailSettings> {
58 parse(&client.rest(Method::GET, "/v1/account/mail-settings", None).await?)
59}
60
61pub async fn set_mail_settings(client: &Client, settings: &MailSettings) -> Result<()> {
62 let body = serde_json::to_value(settings).map_err(|error| Error::Protocol(error.to_string()))?;
63 client.rest(Method::PUT, "/v1/account/mail-settings", Some(Body::Json(body))).await?;
64 Ok(())
65}
66
67pub async fn set_avatar(client: &Client, image: Vec<u8>, media_type: &str) -> Result<()> {
69 client.rest(Method::PUT, "/v1/account/avatar", Some(Body::Bytes(image, media_type.to_owned()))).await?;
70 Ok(())
71}
72
73pub async fn remove_avatar(client: &Client) -> Result<()> {
74 client.rest(Method::DELETE, "/v1/account/avatar", None).await?;
75 Ok(())
76}
77
78pub async fn avatar(client: &Client, account: &str) -> Result<Option<Vec<u8>>> {
80 match client.rest_bytes(&format!("/v1/avatars/{}", crate::encode(account))).await {
81 Ok(bytes) => Ok(Some(bytes)),
82 Err(Error::Status(404, _)) => Ok(None),
83 Err(error) => Err(error),
84 }
85}