From 6e8e12b57970d91528aa09b0365c58cc805be69a Mon Sep 17 00:00:00 2001 From: Ulyssa Date: Fri, 7 Jul 2023 20:35:01 -0700 Subject: [PATCH] Need fallback behaviour when dirs::download_dir returns None (#118) --- src/base.rs | 3 +++ src/config.rs | 7 ++----- src/tests.rs | 2 +- src/windows/room/chat.rs | 7 ++++--- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/base.rs b/src/base.rs index 6a0ea6d..7a173ce 100644 --- a/src/base.rs +++ b/src/base.rs @@ -349,6 +349,9 @@ pub enum IambError { #[error("Serialization/deserialization error: {0}")] Serde(#[from] serde_json::Error), + #[error("No download directory configured")] + NoDownloadDir, + #[error("Selected message does not have any attachments")] NoAttachment, diff --git a/src/config.rs b/src/config.rs index 7682732..e3eba94 100644 --- a/src/config.rs +++ b/src/config.rs @@ -319,7 +319,7 @@ impl Tunables { pub struct DirectoryValues { pub cache: PathBuf, pub logs: PathBuf, - pub downloads: PathBuf, + pub downloads: Option, } #[derive(Clone, Default, Deserialize)] @@ -354,10 +354,7 @@ impl Directories { dir }); - let downloads = self - .downloads - .or_else(dirs::download_dir) - .expect("no dirs.downloads value configured!"); + let downloads = self.downloads.or_else(dirs::download_dir); DirectoryValues { cache, logs, downloads } } diff --git a/src/tests.rs b/src/tests.rs index 668ac1e..94d120f 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -169,7 +169,7 @@ pub fn mock_dirs() -> DirectoryValues { DirectoryValues { cache: PathBuf::new(), logs: PathBuf::new(), - downloads: PathBuf::new(), + downloads: None, } } diff --git a/src/windows/room/chat.rs b/src/windows/room/chat.rs index d01963a..3b06d22 100644 --- a/src/windows/room/chat.rs +++ b/src/windows/room/chat.rs @@ -186,9 +186,10 @@ impl ChatState { if let MessageEvent::Original(ev) = &msg.event { let media = client.media(); - let mut filename = match filename { - Some(f) => PathBuf::from(f), - None => settings.dirs.downloads.clone(), + let mut filename = match (filename, &settings.dirs.downloads) { + (Some(f), _) => PathBuf::from(f), + (None, Some(downloads)) => downloads.clone(), + (None, None) => return Err(IambError::NoDownloadDir.into()), }; let (source, msg_filename) = match &ev.content.msgtype {