about summary refs log tree commit diff stats
path: root/src/config/file_system.rs
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-08-24 11:27:31 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2024-08-24 11:45:28 +0200
commit43522ef7898c60ffd3e7c5ff056fd765635bbc5c (patch)
tree4c9bea495ca8e2ba779d6c9fc952f0aca7770c72 /src/config/file_system.rs
parentfeat(videos): Allow limiting the number of videos to show (diff)
downloadyt-43522ef7898c60ffd3e7c5ff056fd765635bbc5c.tar.gz
yt-43522ef7898c60ffd3e7c5ff056fd765635bbc5c.zip
fix(config): Check for wrong keys in the config file
Diffstat (limited to '')
-rw-r--r--src/config/file_system.rs91
1 files changed, 40 insertions, 51 deletions
diff --git a/src/config/file_system.rs b/src/config/file_system.rs
index 396b854..fd3a8d8 100644
--- a/src/config/file_system.rs
+++ b/src/config/file_system.rs
@@ -19,17 +19,34 @@ use std::{fs::read_to_string, path::PathBuf};
 
 use anyhow::{Context, Result};
 use bytes::Bytes;
-use toml::Table;
 
 macro_rules! get {
-    ($default:path, $config:expr, $get_fn:ident, $key_one:expr, $($keys:expr),*) => {
-        try_get!{@default $default, $config, $get_fn, $key_one, $($keys),*}
-             .with_context(|| format!("Failed to parse '{}' as a '{}'", stringify!($key_one), stringify!($get_fn)))?
+    ($default:path, $config:expr, $key_one:ident, $($keys:ident),*) => {
+        {
+            let maybe_value = get!{@option $config, $key_one, $($keys),*};
+            if let Some(value) = maybe_value {
+                value
+            } else {
+                $default().to_owned()
+            }
+        }
+    };
+
+    (@option $config:expr, $key_one:ident, $($keys:ident),*) => {
+        if let Some(key) = $config.$key_one.clone() {
+            get!{@option key, $($keys),*}
+        } else {
+            None
+        }
+    };
+    (@option $config:expr, $key_one:ident) => {
+        $config.$key_one
     };
-    (@path_if_none $config:expr, $option_default:expr, $default:path, $key_one:expr, $($keys:expr),*) => {
+
+    (@path_if_none $config:expr, $option_default:expr, $default:path, $key_one:ident, $($keys:ident),*) => {
         {
-            let maybe_download_dir =
-                try_get! {@option $config, as_str, $key_one, $($keys),*};
+            let maybe_download_dir: Option<PathBuf> =
+                get! {@option $config, $key_one, $($keys),*};
 
             let down_dir = if let Some(dir) = maybe_download_dir {
                 PathBuf::from(dir)
@@ -44,35 +61,10 @@ macro_rules! get {
             create_path(down_dir)?
         }
     };
-    (@path $config:expr, $default:path, $key_one:expr, $($keys:expr),*) => {
+    (@path $config:expr, $default:path, $key_one:ident, $($keys:ident),*) => {
         get! {@path_if_none $config, None, $default, $key_one, $($keys),*}
     };
 }
-macro_rules! try_get {
-    (@option $config:expr, $get_fn:ident, $key_one:expr, $($keys:expr),*) => {
-        $config.get($key_one).map(|val| {
-            try_get! {@option val, $get_fn, $($keys),*}
-        }).flatten().flatten()
-    };
-    (@option $config:expr, $get_fn:ident, $key_one:expr) => {
-        $config.get($key_one).map(|val| val.$get_fn())
-    };
-
-    (@default $default:path, $config:expr, $get_fn:ident, $key_one:expr, $($keys:expr),*) => {
-        if let Some(a) = $config.get($key_one) {
-            try_get! {@default $default, a, $get_fn, $($keys),*}
-        } else {
-            Some($default())
-        }
-    };
-    (@default $default:path, $config:expr, $get_fn:ident, $key_one:expr) => {
-        if let Some(a) = $config.get($key_one) {
-            a.$get_fn()
-        } else {
-            Some($default())
-        }
-    };
-}
 
 impl Config {
     pub fn from_config_file(
@@ -83,39 +75,36 @@ impl Config {
             .map(|val| Ok(val))
             .unwrap_or_else(|| -> Result<_> { paths::config_path() })?;
 
-        let config: Table = read_to_string(config_file_path).unwrap_or("".to_owned())
-            .parse()
-            .context("Failed to parse the config file as toml")?;
+        let config: super::definitions::ConfigFile =
+            toml::from_str(&read_to_string(config_file_path).unwrap_or("".to_owned()))
+                .context("Failed to parse the config file as toml")?;
 
         Ok(Self {
             select: SelectConfig {
-                playback_speed: get! {select::playback_speed, config, as_float, "select", "playback_speed"},
-                subtitle_langs:
-                    get! {select::subtitle_langs, config, as_str, "select", "subtitle_langs"}
-                        .to_owned(),
+                playback_speed: get! {select::playback_speed, config, select, playback_speed},
+                subtitle_langs: get! {select::subtitle_langs, config, select, subtitle_langs},
             },
             watch: WatchConfig {
-                local_comments_length: get! {watch::local_comments_length, config, as_integer, "watch", "local_comments_length"}
-                    as usize,
+                local_comments_length: get! {watch::local_comments_length, config, watch, local_comments_length},
             },
             update: UpdateConfig {
-                max_backlog: get! {update::max_backlog, config, as_integer, "update", "max_backlog"}
-                    as u32,
+                max_backlog: get! {update::max_backlog, config, update, max_backlog},
             },
             paths: PathsConfig {
-                download_dir: get! {@path config, paths::download_dir, "paths", "download_dir"},
-                mpv_config_path: get! {@path config, paths::mpv_config_path, "paths", "mpv_config_path"},
-                mpv_input_path: get! {@path config, paths::mpv_input_path, "paths", "mpv_input_path"},
-                database_path: get! {@path_if_none config, db_path, paths::database_path, "paths", "database_path"},
-                last_selection_path: get! {@path config, paths::last_selection_path, "paths", "last_selection_path"},
+                download_dir: get! {@path config, paths::download_dir, paths, download_dir},
+                mpv_config_path: get! {@path config, paths::mpv_config_path, paths, mpv_config_path},
+                mpv_input_path: get! {@path config, paths::mpv_input_path, paths, mpv_input_path},
+                database_path: get! {@path_if_none config, db_path, paths::database_path, paths, database_path},
+                last_selection_path: get! {@path config, paths::last_selection_path, paths, last_selection_path},
             },
             download: DownloadConfig {
                 max_cache_size: {
-                    let bytes_str = get! {download::max_cache_size, config, as_str, "download", "max_cache_path"};
+                    let bytes_str: String =
+                        get! {download::max_cache_size, config, download, max_cache_size};
                     let number: Bytes = bytes_str
                         .parse()
                         .context("Failed to parse max_cache_size")?;
-                    number.as_u64()
+                    number
                 },
             },
         })