ddnet_account_client/
delete.rs

1use ddnet_accounts_shared::client::delete;
2use thiserror::Error;
3
4use crate::{
5    errors::{FsLikeError, HttpLikeError},
6    interface::Io,
7    safe_interface::{IoSafe, SafeIo},
8};
9
10/// The result of a [`delete`] request.
11#[derive(Error, Debug)]
12pub enum DeleteResult {
13    /// A http like error occurred.
14    #[error("{0}")]
15    HttpLikeError(HttpLikeError),
16    /// A fs like error occurred.
17    #[error("{0}")]
18    FsLikeError(FsLikeError),
19    /// Errors that are not handled explicitly.
20    #[error("Delete failed: {0}")]
21    Other(anyhow::Error),
22}
23
24impl From<HttpLikeError> for DeleteResult {
25    fn from(value: HttpLikeError) -> Self {
26        Self::HttpLikeError(value)
27    }
28}
29
30impl From<FsLikeError> for DeleteResult {
31    fn from(value: FsLikeError) -> Self {
32        Self::FsLikeError(value)
33    }
34}
35
36/// Delete an account on the account server.
37pub async fn delete(account_token_hex: String, io: &dyn Io) -> anyhow::Result<(), DeleteResult> {
38    delete_impl(account_token_hex, io.into()).await
39}
40
41async fn delete_impl(
42    account_token_hex: String,
43    io: IoSafe<'_>,
44) -> anyhow::Result<(), DeleteResult> {
45    let delete_req = delete::delete(account_token_hex).map_err(DeleteResult::Other)?;
46
47    io.request_delete_account(delete_req)
48        .await?
49        .map_err(|err| DeleteResult::Other(err.into()))?;
50    // this is generally allowed to fail
51    let _ = io.remove_serialized_session_key_pair().await;
52
53    Ok(())
54}