From e8054b73a2a30273ea1f0da64b3f7c7581a4b995 Mon Sep 17 00:00:00 2001 From: Simon Tatham Date: Sat, 13 Jan 2024 10:30:26 +0000 Subject: [PATCH] Client request to update your account details. --- src/client.rs | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/client.rs b/src/client.rs index bd771f2..ee4e61b 100644 --- a/src/client.rs +++ b/src/client.rs @@ -84,6 +84,21 @@ impl Followness { } } +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct AccountDetails { + pub display_name: String, + // pub bio: String, + pub default_visibility: Visibility, + pub default_sensitive: bool, + pub default_language: Option, + pub locked: bool, + pub bot: bool, + pub discoverable: bool, + pub hide_collections: bool, + pub indexable: bool, + // pub fields: Vec<(String, String)>, +} + #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum AccountFlag { Block, Mute } @@ -166,6 +181,14 @@ impl Req { } } + pub fn patch(url_suffix: &str) -> Self { + Req { + method: reqwest::Method::PATCH, + url_suffix: url_suffix.to_owned(), + parameters: Vec::new(), + } + } + pub fn param(mut self, key: &str, value: T) -> Self where T: ReqParam { @@ -1264,4 +1287,44 @@ impl Client { Ok(()) } } + + pub fn set_account_details(&mut self, id: &str, details: AccountDetails) + -> Result<(), ClientError> + { + // TODO: add "note" with details.bio, and "fields_attributes" + // for the variable info fields + let req = Req::patch("v1/accounts/update_credentials") + .param("display_name", &details.display_name) + .param("locked", details.locked) + .param("bot", details.bot) + .param("hide_collections", details.hide_collections) + .param("indexable", details.indexable) + .param("discoverable", details.discoverable) + .param("source[privacy]", details.default_visibility) + .param("source[sensitive]", details.default_sensitive); + let req = if let Some(ref lang) = details.default_language { + req.param("source[language]", lang) + } else { + req + }; + + let (url, rsp) = self.api_request(req)?; + let rspstatus = rsp.status(); + let ac: Account = if !rspstatus.is_success() { + Err(ClientError::UrlError(url.clone(), rspstatus.to_string())) + } else { + match serde_json::from_str(&rsp.text()?) { + Ok(ac) => Ok(ac), + Err(e) => Err(ClientError::UrlError( + url.clone(), e.to_string())), + } + }?; + if ac.id != id { + return Err(ClientError::UrlError( + url, format!("request returned wrong account id {}", + &ac.id))); + } + self.cache_account(&ac); + Ok(()) + } } -- 2.30.2