From 5a85e4f6c32bbd38623ee10c306179b1246ed670 Mon Sep 17 00:00:00 2001 From: uku Date: Thu, 22 May 2025 18:45:59 +0200 Subject: [PATCH] feat: add zipline error type --- src/relm.rs | 1 - src/zipline.rs | 54 ++++++++++++++++++++++++-------------------------- 2 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/relm.rs b/src/relm.rs index 3c84af0..b01336d 100644 --- a/src/relm.rs +++ b/src/relm.rs @@ -150,7 +150,6 @@ impl SimpleComponent for Toast { pub struct StandaloneDialog; -// TODO: don't open a window, just give a HeaderBar to the dialog impl SimpleComponent for StandaloneDialog { type Init = String; type Input = (); diff --git a/src/zipline.rs b/src/zipline.rs index f4d8690..1744e54 100644 --- a/src/zipline.rs +++ b/src/zipline.rs @@ -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 relm4::Sender; use reqwest::{ @@ -47,6 +47,25 @@ pub struct ZiplineShortUrl { 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 { pub fn thumbnail_url(&self, config: &Config) -> Option { self.thumbnail @@ -80,7 +99,6 @@ async fn wrap_file(path: &Path, sender: Sender) -> Result }) } -// TODO: make a ZiplineError type pub async fn get_folders(config: &Config) -> Result> { let url = format!("{}api/user/folders?noincl=true", config.fixed_url()); @@ -91,11 +109,7 @@ pub async fn get_folders(config: &Config) -> Result> { .await?; if res.status() != StatusCode::OK { - bail!( - "an error occurred ({}): {}", - res.status(), - res.text().await? - ); + Err(res.json::().await?.into()) } else { res.json().await.map_err(Into::into) } @@ -125,11 +139,7 @@ pub async fn upload_file( let res = req.send().await?; if res.status() != StatusCode::OK { - bail!( - "an error occurred ({}): {}", - res.status(), - res.text().await? - ); + Err(res.json::().await?.into()) } else { res.json().await.map_err(Into::into) } @@ -146,11 +156,7 @@ pub async fn recalc_thumbnails(config: &Config) -> Result<()> { .await?; if res.status() != StatusCode::OK { - bail!( - "an error occurred ({}): {}", - res.status(), - res.text().await? - ); + Err(res.json::().await?.into()) } else { Ok(()) } @@ -166,11 +172,7 @@ pub async fn get_file_details(config: &Config, id: &str) -> Result().await?.into()) } else { res.json().await.map_err(Into::into) } @@ -193,11 +195,7 @@ pub async fn shorten_url(config: &Config, to_shorten: &str) -> Result { .await?; if res.status() != StatusCode::OK { - bail!( - "an error occurred ({}): {}", - res.status(), - res.text().await? - ); + Err(res.json::().await?.into()) } else { let out: ZiplineShortUrl = res.json().await?;