Skip to content

Commit

Permalink
Improve config defaults
Browse files Browse the repository at this point in the history
- Rename `custom` field for node metadata to `meta`.
- Move `icon` to `meta.icon`.
- Rename `normal_ui` to `default_ui`.
- Split `modes` into `modes.builtin` and `modes.custom`.
- Add the missing `create file` mode.
- Rename `focused_ui` to `focus_ui`.
- Make `general.table.header` non-nullable.
- Add support for incremental configuration updates.

Ref: #45
  • Loading branch information
sayanarijit committed Apr 10, 2021
1 parent 6aa3df3 commit eb68c7f
Show file tree
Hide file tree
Showing 5 changed files with 1,060 additions and 630 deletions.
87 changes: 55 additions & 32 deletions src/app.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use crate::config::Config;
use crate::config::Mode;
use crate::default_config::DEFAULT_CONFIG;
use crate::input::Key;
use anyhow::{bail, Result};
use chrono::{DateTime, Utc};
Expand Down Expand Up @@ -703,7 +702,10 @@ pub fn is_compatible(configv: &str, appv: &str) -> bool {
.strip_prefix('v')
.unwrap_or_default()
.split('.')
.map(|c| c.parse::<u64>().unwrap());
.map(|c| {
c.parse::<u64>()
.expect("invalid version format in the config file")
});

let mut appv = appv
.strip_prefix('v')
Expand Down Expand Up @@ -750,15 +752,19 @@ impl App {
.join("xplr");

let config_file = config_dir.join("config.yml");
let default_config = Config::default();
let default_config_version = default_config.version.clone();

let config: Config = if config_file.exists() {
serde_yaml::from_reader(io::BufReader::new(&fs::File::open(&config_file)?))?
let c: Config =
serde_yaml::from_reader(io::BufReader::new(&fs::File::open(&config_file)?))?;
c.merged()
} else {
Config::default()
default_config
};

if config.version != DEFAULT_CONFIG.version
&& !is_compatible(&config.version, &DEFAULT_CONFIG.version)
if config.version != default_config_version
&& !is_compatible(&config.version, &default_config_version)
{
bail!(
"incompatible configuration version in {}
Expand All @@ -767,12 +773,12 @@ impl App {
Visit {}",
config_file.to_string_lossy().to_string(),
config.version,
DEFAULT_CONFIG.version,
default_config_version,
UPGRADE_GUIDE_LINK,
)
};

let mode = match config.modes.get(&"default".to_string()) {
let mode = match config.modes.builtin.get(&"default".to_string()) {
Some(m) => m.clone(),
None => {
bail!("'default' mode is missing")
Expand All @@ -798,7 +804,7 @@ impl App {
}

Ok(Self {
version: DEFAULT_CONFIG.version.clone(),
version: Config::default().version,
config,
pwd: pwd.to_string_lossy().to_string(),
directory_buffers: Default::default(),
Expand Down Expand Up @@ -1412,29 +1418,46 @@ impl App {
}

pub fn global_help_menu_str(&self) -> String {
self.config()
.modes
.iter()
.map(|(name, mode)| {
let help = mode
.help_menu()
.iter()
.map(|l| match l {
HelpMenuLine::Paragraph(p) => format!("\t{}\n", p),
HelpMenuLine::KeyMap(k, h) => {
format!(" {:15} | {}\n", k, h)
}
})
.collect::<Vec<String>>()
.join("");

format!(
"### {}\n\n key | action\n --------------- | ------\n{}\n",
name, help
)
})
.collect::<Vec<String>>()
.join("\n")
let builtin = self.config().modes.builtin.clone();
let custom = self.config().modes.custom.clone();

[
(builtin.default.name.clone(), builtin.default),
(builtin.number.name.clone(), builtin.number),
(builtin.go_to.name.clone(), builtin.go_to),
(builtin.search.name.clone(), builtin.search),
(builtin.selection_ops.name.clone(), builtin.selection_ops),
(builtin.action.name.clone(), builtin.action),
(builtin.create.name.clone(), builtin.create),
(builtin.create_file.name.clone(), builtin.create_file),
(
builtin.create_directory.name.clone(),
builtin.create_directory,
),
(builtin.delete.name.clone(), builtin.delete),
]
.iter()
.chain(custom.into_iter().collect::<Vec<(String, Mode)>>().iter())
.map(|(name, mode)| {
let help = mode
.help_menu()
.iter()
.map(|l| match l {
HelpMenuLine::Paragraph(p) => format!("\t{}\n", p),
HelpMenuLine::KeyMap(k, h) => {
format!(" {:15} | {}\n", k, h)
}
})
.collect::<Vec<String>>()
.join("");

format!(
"### {}\n\n key | action\n --------------- | ------\n{}\n",
name, help
)
})
.collect::<Vec<String>>()
.join("\n")
}

/// Get a reference to the app's version.
Expand Down
Loading

0 comments on commit eb68c7f

Please sign in to comment.