diff options
Diffstat (limited to 'src/config/file_system.rs')
-rw-r--r-- | src/config/file_system.rs | 91 |
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 }, }, }) |