feat: add zipline error type

This commit is contained in:
uku 2025-05-22 18:45:59 +02:00
parent 0659698f19
commit 5a85e4f6c3
Signed by: uku
SSH key fingerprint: SHA256:4P0aN6M8ajKukNi6aPOaX0LacanGYtlfjmN+m/sHY/o
2 changed files with 26 additions and 29 deletions

View file

@ -150,7 +150,6 @@ impl SimpleComponent for Toast {
pub struct StandaloneDialog; pub struct StandaloneDialog;
// TODO: don't open a window, just give a HeaderBar to the dialog
impl SimpleComponent for StandaloneDialog { impl SimpleComponent for StandaloneDialog {
type Init = String; type Init = String;
type Input = (); type Input = ();

View file

@ -1,6 +1,6 @@
use std::{path::Path, sync::LazyLock}; use std::{error::Error, fmt::Display, path::Path, sync::LazyLock};
use anyhow::{Result, bail}; use anyhow::Result;
use futures::StreamExt; use futures::StreamExt;
use relm4::Sender; use relm4::Sender;
use reqwest::{ use reqwest::{
@ -47,6 +47,25 @@ pub struct ZiplineShortUrl {
url: String, url: String,
} }
#[derive(Debug, serde::Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ZiplineError {
error: String,
status_code: usize,
}
impl Display for ZiplineError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"An error occurred ({}): {}",
self.status_code, self.error
)
}
}
impl Error for ZiplineError {}
impl ZiplineFileInfo { impl ZiplineFileInfo {
pub fn thumbnail_url(&self, config: &Config) -> Option<String> { pub fn thumbnail_url(&self, config: &Config) -> Option<String> {
self.thumbnail self.thumbnail
@ -80,7 +99,6 @@ async fn wrap_file(path: &Path, sender: Sender<ProgressMessage>) -> Result<Part>
}) })
} }
// TODO: make a ZiplineError type
pub async fn get_folders(config: &Config) -> Result<Vec<ZiplineFolder>> { pub async fn get_folders(config: &Config) -> Result<Vec<ZiplineFolder>> {
let url = format!("{}api/user/folders?noincl=true", config.fixed_url()); let url = format!("{}api/user/folders?noincl=true", config.fixed_url());
@ -91,11 +109,7 @@ pub async fn get_folders(config: &Config) -> Result<Vec<ZiplineFolder>> {
.await?; .await?;
if res.status() != StatusCode::OK { if res.status() != StatusCode::OK {
bail!( Err(res.json::<ZiplineError>().await?.into())
"an error occurred ({}): {}",
res.status(),
res.text().await?
);
} else { } else {
res.json().await.map_err(Into::into) res.json().await.map_err(Into::into)
} }
@ -125,11 +139,7 @@ pub async fn upload_file(
let res = req.send().await?; let res = req.send().await?;
if res.status() != StatusCode::OK { if res.status() != StatusCode::OK {
bail!( Err(res.json::<ZiplineError>().await?.into())
"an error occurred ({}): {}",
res.status(),
res.text().await?
);
} else { } else {
res.json().await.map_err(Into::into) res.json().await.map_err(Into::into)
} }
@ -146,11 +156,7 @@ pub async fn recalc_thumbnails(config: &Config) -> Result<()> {
.await?; .await?;
if res.status() != StatusCode::OK { if res.status() != StatusCode::OK {
bail!( Err(res.json::<ZiplineError>().await?.into())
"an error occurred ({}): {}",
res.status(),
res.text().await?
);
} else { } else {
Ok(()) Ok(())
} }
@ -166,11 +172,7 @@ pub async fn get_file_details(config: &Config, id: &str) -> Result<ZiplineFileIn
.await?; .await?;
if res.status() != StatusCode::OK { if res.status() != StatusCode::OK {
bail!( Err(res.json::<ZiplineError>().await?.into())
"an error occurred ({}): {}",
res.status(),
res.text().await?
);
} else { } else {
res.json().await.map_err(Into::into) res.json().await.map_err(Into::into)
} }
@ -193,11 +195,7 @@ pub async fn shorten_url(config: &Config, to_shorten: &str) -> Result<String> {
.await?; .await?;
if res.status() != StatusCode::OK { if res.status() != StatusCode::OK {
bail!( Err(res.json::<ZiplineError>().await?.into())
"an error occurred ({}): {}",
res.status(),
res.text().await?
);
} else { } else {
let out: ZiplineShortUrl = res.json().await?; let out: ZiplineShortUrl = res.json().await?;