1use derive_builder::Builder;
2use reqwest::StatusCode;
3use thiserror::Error;
4
5pub mod http;
6
7#[derive(Debug, Clone, Builder)]
8#[builder(setter(into), default)]
9pub struct Client<'a> {
10 #[builder(setter(skip))]
11 http: reqwest::Client,
12 base_uri: &'a str,
13}
14
15impl<'a> Default for Client<'a> {
16 fn default() -> Self {
17 Self {
18 http: Default::default(),
19 base_uri: "files.vc",
20 }
21 }
22}
23
24impl<'a> Client<'a> {
25 pub fn builder() -> ClientBuilder<'a> {
26 ClientBuilder::default()
27 }
28
29 pub async fn get_hashsum(&self, file: &str) -> Result<String, GetHashsumError> {
30 let response = self
31 .http
32 .get(format!("https://{}/hashsum/{file}", self.base_uri))
33 .send()
34 .await?;
35
36 let content = match response.status() {
37 StatusCode::OK => response.text().await?,
38 StatusCode::NOT_FOUND => return Err(GetHashsumError::FileDoesNotExist),
39 status => return Err(GetHashsumError::UnknownStatusCode(status)),
40 };
41
42 if !content.contains("(SHA1)") {
43 return Err(GetHashsumError::MalformedResponse(content));
44 }
45
46 let hashsum = content
47 .strip_suffix(" (SHA1)")
48 .ok_or(GetHashsumError::MalformedResponse(content.to_owned()))?
49 .to_string();
50
51 Ok(hashsum)
52 }
53
54 pub async fn delete_file(&self, file: &str) -> Result<(), DeleteFileError> {
55 let response = self
56 .http
57 .delete(format!("https://{}/a/{file}", self.base_uri))
58 .send()
59 .await?;
60
61 match response.status() {
62 StatusCode::OK => Ok(()),
63 StatusCode::NOT_FOUND => Err(DeleteFileError::FileDoesNotExist),
64 status => Err(DeleteFileError::UnknownStatusCode(status)),
65 }
66 }
67}
68
69#[derive(Debug, Error)]
70pub enum GetHashsumError {
71 #[error("The server returned an unknown status code {0}")]
72 UnknownStatusCode(StatusCode),
73 #[error("The server returned a malformed response {0}")]
74 MalformedResponse(String),
75 #[error("The file does not exist")]
76 FileDoesNotExist,
77 #[error(transparent)]
78 Http(#[from] reqwest::Error),
79}
80
81#[derive(Debug, Error)]
82pub enum DeleteFileError {
83 #[error("The server returned an unknown status code {0}")]
84 UnknownStatusCode(StatusCode),
85 #[error("The file does not exist")]
86 FileDoesNotExist,
87 #[error(transparent)]
88 Http(#[from] reqwest::Error),
89}