ffsend_api/action/
delete.rs1use thiserror::Error;
2
3use crate::api::data::{Error as DataError, OwnedData};
4use crate::api::nonce::{request_nonce, NonceError};
5use crate::api::request::{ensure_success, ResponseError};
6use crate::api::url::UrlBuilder;
7use crate::client::Client;
8use crate::file::remote_file::RemoteFile;
9
10pub struct Delete<'a> {
14 file: &'a RemoteFile,
16
17 nonce: Vec<u8>,
20}
21
22impl<'a> Delete<'a> {
23 pub fn new(file: &'a RemoteFile, nonce: Option<Vec<u8>>) -> Self {
25 Self {
26 file,
27 nonce: nonce.unwrap_or_default(),
28 }
29 }
30
31 pub fn invoke(mut self, client: &Client) -> Result<(), Error> {
33 if self.nonce.is_empty() {
35 self.nonce = self.fetch_auth_nonce(client)?;
36 }
37
38 let data = OwnedData::from(DeleteData::new(), &self.file)
40 .map_err(|err| PrepareError::DeleteData(DeleteDataError::Owned(err)))?;
41
42 self.request_delete(client, &data)
44 }
45
46 fn fetch_auth_nonce(&self, client: &Client) -> Result<Vec<u8>, Error> {
48 request_nonce(client, UrlBuilder::download(self.file, false)).map_err(|err| err.into())
49 }
50
51 fn request_delete(&self, client: &Client, data: &OwnedData<DeleteData>) -> Result<(), Error> {
53 let url = UrlBuilder::api_delete(self.file);
55 let response = client
56 .post(url)
57 .json(&data)
58 .send()
59 .map_err(|_| DeleteError::Request)?;
60
61 ensure_success(&response).map_err(|err| err.into())
63 }
64}
65
66#[derive(Debug, Serialize, Default)]
70pub struct DeleteData {}
71
72impl DeleteData {
73 pub fn new() -> Self {
75 DeleteData::default()
76 }
77}
78
79#[derive(Error, Debug)]
80pub enum Error {
81 #[error("failed to prepare the action")]
83 Prepare(#[from] PrepareError),
84
85 #[error("the file has expired or did never exist")]
88 Expired,
89
90 #[error("failed to send the file deletion request")]
92 Delete(#[from] DeleteError),
93}
94
95impl From<NonceError> for Error {
96 fn from(err: NonceError) -> Error {
97 match err {
98 NonceError::Expired => Error::Expired,
99 err => Error::Prepare(PrepareError::Auth(err)),
100 }
101 }
102}
103
104#[derive(Debug, Error)]
105pub enum DeleteDataError {
106 #[error("")]
110 Owned(#[from] DataError),
111}
112
113#[derive(Error, Debug)]
114pub enum PrepareError {
115 #[error("failed to authenticate")]
117 Auth(#[from] NonceError),
118
119 #[error("invalid parameters")]
122 DeleteData(#[from] DeleteDataError),
123}
124
125#[derive(Error, Debug)]
126pub enum DeleteError {
127 #[error("failed to send file deletion request")]
129 Request,
130
131 #[error("bad response from server while deleting file")]
133 Response(#[from] ResponseError),
134}
135
136impl From<ResponseError> for Error {
137 fn from(err: ResponseError) -> Self {
138 match err {
139 ResponseError::Expired => Error::Expired,
140 err => Error::Delete(DeleteError::Response(err)),
141 }
142 }
143}