diff --git a/src/error.rs b/src/error.rs index 3b776a7..34dcee0 100644 --- a/src/error.rs +++ b/src/error.rs @@ -71,3 +71,21 @@ pub enum VerifyAccountError { #[error("Failed to verify account: unknown verification token")] UnknownToken, } + +#[derive(Debug, Error)] +pub enum DeleteAccountError { + #[error("Failed to delete account: the API complains about a malformed request")] + BadRequest, + + #[error("Failed to delete account: unprocessable API response")] + BadResponse, + + #[error("Failed to delete account: failed to send request")] + RequestSend(reqwest::Error), + + #[error("Failed to delete account: you are not authorized to perform that operation")] + Unauthorized, + + #[error("Failed to delete account: blocked for security reasons")] + Forbidden, +} diff --git a/src/lib.rs b/src/lib.rs index bf2a836..ac84652 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,8 +2,8 @@ pub mod error; pub mod request; pub mod response; -use crate::error::{AuthError, RegisterError, VerifyAccountError}; -use anyhow::Result; +use crate::error::*; +use anyhow::{Context, Result}; use reqwest::StatusCode; use std::fmt::Debug; @@ -146,6 +146,41 @@ impl Session { } } + pub async fn delete_account( + &mut self, + reason: Option, + ) -> Result<(), DeleteAccountError> { + let url = format!("{}/account/delete", &self.base_url); + + let body = request::AccountDelete { reason }; + + let request = self + .client + .delete(&url) + .bearer_auth( + self.auth_token + .clone() + .context("") + .map_err(|_| DeleteAccountError::Unauthorized)?, + ) + .json(&body); + let response = request + .send() + .await + .map_err(|e| DeleteAccountError::RequestSend(e))?; + + match response.status() { + StatusCode::OK => { + self.auth_token = None; + Ok(()) + } + StatusCode::BAD_REQUEST => Err(DeleteAccountError::BadRequest), + StatusCode::UNAUTHORIZED => Err(DeleteAccountError::Unauthorized), + StatusCode::FORBIDDEN => Err(DeleteAccountError::Forbidden), + _ => Err(DeleteAccountError::BadResponse), + } + } + pub fn is_authenticated(&self) -> bool { self.auth_token.is_some() } diff --git a/src/request.rs b/src/request.rs index b6ad028..a595667 100644 --- a/src/request.rs +++ b/src/request.rs @@ -17,3 +17,8 @@ pub struct AccountRegister { pub struct AccountVerify { pub token: String, } + +#[derive(Debug, Serialize, Clone)] +pub struct AccountDelete { + pub reason: Option, +}