summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDanilo Bargen <mail@dbrgn.ch>2022-06-16 21:51:16 +0200
committerDanilo Bargen <mail@dbrgn.ch>2022-10-01 12:18:30 +0200
commitfb89303e85a76e8f42e2e639d62df2cbcbd2c2b3 (patch)
tree9a8802f3f3e9d2268be3580b79852c5508df6557
parent7338933de543cc1c05db91aa396c8460513033a6 (diff)
Move custom_pages_dir business logic from RawConfig to Config
This also introduces the path source information for that directory, which was previously unknown.
-rw-r--r--src/config.rs54
-rw-r--r--src/main.rs37
2 files changed, 52 insertions, 39 deletions
diff --git a/src/config.rs b/src/config.rs
index 28c15ef..4907de0 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -1,7 +1,7 @@
use std::{
- env, fs,
+ env, fmt, fs,
io::{Read, Write},
- path::PathBuf,
+ path::{Path, PathBuf},
time::Duration,
};
@@ -162,7 +162,7 @@ impl Default for RawUpdatesConfig {
}
}
-#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
+#[derive(Debug, Default, Serialize, Deserialize, PartialEq, Eq)]
struct RawDirectoriesConfig {
#[serde(default)]
pub cache_dir: Option<PathBuf>,
@@ -170,20 +170,6 @@ struct RawDirectoriesConfig {
pub custom_pages_dir: Option<PathBuf>,
}
-impl Default for RawDirectoriesConfig {
- fn default() -> Self {
- Self {
- cache_dir: None,
- custom_pages_dir: get_app_root(AppDataType::UserData, &crate::APP_INFO)
- .map(|path| {
- // Note: The `join("")` call ensures that there's a trailing slash
- path.join("pages").join("")
- })
- .ok(),
- }
- }
-}
-
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(default)]
struct RawConfig {
@@ -246,10 +232,22 @@ pub struct PathWithSource {
pub source: PathSource,
}
+impl PathWithSource {
+ pub fn path(&self) -> &Path {
+ &self.path
+ }
+}
+
+impl fmt::Display for PathWithSource {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{} ({})", self.path.display(), self.source)
+ }
+}
+
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct DirectoriesConfig {
pub cache_dir: PathWithSource,
- pub custom_pages_dir: Option<PathBuf>,
+ pub custom_pages_dir: Option<PathWithSource>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
@@ -316,9 +314,27 @@ impl Config {
// If everything fails, give up
bail!("Could not determine user cache directory");
};
+ let custom_pages_dir = raw_config
+ .directories
+ .custom_pages_dir
+ .map(|path| PathWithSource {
+ path,
+ source: PathSource::OsConvention,
+ })
+ .or_else(|| {
+ get_app_root(AppDataType::UserData, &crate::APP_INFO)
+ .map(|path| {
+ // Note: The `join("")` call ensures that there's a trailing slash
+ PathWithSource {
+ path: path.join("pages").join(""),
+ source: PathSource::ConfigFile,
+ }
+ })
+ .ok()
+ });
let directories = DirectoriesConfig {
cache_dir,
- custom_pages_dir: raw_config.directories.custom_pages_dir,
+ custom_pages_dir,
};
Ok(Self {
diff --git a/src/main.rs b/src/main.rs
index c1151bf..ab30391 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -43,7 +43,7 @@ mod utils;
use crate::{
cache::{Cache, CacheFreshness, PageLookupResult, TLDR_PAGES_DIR},
cli::Args,
- config::{get_config_dir, get_config_path, make_default_config, Config},
+ config::{get_config_dir, get_config_path, make_default_config, Config, PathWithSource},
extensions::Dedup,
output::print_page,
types::{ColorOptions, PlatformType},
@@ -161,24 +161,17 @@ fn show_paths(config: &Config) {
|e| format!("[Error: {}]", e),
|(path, _)| path.display().to_string(),
);
- let cache_dir = format!(
- "{} ({})",
- config.directories.cache_dir.path.display(),
- config.directories.cache_dir.source
- );
+ let cache_dir = config.directories.cache_dir.to_string();
let pages_dir = {
let mut path = config.directories.cache_dir.path.clone();
path.push(TLDR_PAGES_DIR);
path.push(""); // Trailing path separator
path.display().to_string()
};
- let custom_pages_dir = config.directories.custom_pages_dir.as_deref().map_or_else(
- || "[None]".to_string(),
- |path| {
- path.to_str()
- .map_or_else(|| "[Invalid]".to_string(), ToString::to_string)
- },
- );
+ let custom_pages_dir = match config.directories.custom_pages_dir {
+ Some(ref path_with_source) => path_with_source.to_string(),
+ None => "[None]".to_string(),
+ };
println!("Config dir: {}", config_dir);
println!("Config path: {}", config_path);
println!("Cache dir: {}", cache_dir);
@@ -361,12 +354,12 @@ fn main() {
// List cached commands and exit
if args.list {
- println!(
- "{}",
- cache
- .list_pages(config.directories.custom_pages_dir.as_deref())
- .join("\n")
- );
+ let custom_pages_dir = config
+ .directories
+ .custom_pages_dir
+ .as_ref()
+ .map(PathWithSource::path);
+ println!("{}", cache.list_pages(custom_pages_dir).join("\n"));
process::exit(0);
}
@@ -386,7 +379,11 @@ fn main() {
if let Some(lookup_result) = cache.find_page(
&command,
&languages,
- config.directories.custom_pages_dir.as_deref(),
+ config
+ .directories
+ .custom_pages_dir
+ .as_ref()
+ .map(PathWithSource::path),
) {
if let Err(ref e) =
print_page(&lookup_result, args.raw, enable_styles, args.pager, &config)