summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Oram <dev@mitmaro.ca>2020-12-26 13:02:58 -0330
committerTim Oram <dev@mitmaro.ca>2020-12-27 11:05:39 -0330
commitf7e0f511d432ed318079ff2fbbc501515b351b3e (patch)
tree78a0467702c15061831c16511ae20f3b0dd7ecc1
parentd96ce268a038af8124eaffb3cd8a1c43fd8a81e8 (diff)
Add diff configuration settings
-rw-r--r--src/lib/diff_ignore_whitespace_setting.rs6
-rw-r--r--src/lib/diff_show_whitespace_setting.rs7
-rw-r--r--src/lib/mod.rs58
3 files changed, 71 insertions, 0 deletions
diff --git a/src/lib/diff_ignore_whitespace_setting.rs b/src/lib/diff_ignore_whitespace_setting.rs
new file mode 100644
index 0000000..5bb6e47
--- /dev/null
+++ b/src/lib/diff_ignore_whitespace_setting.rs
@@ -0,0 +1,6 @@
+#[derive(Clone, PartialEq, Debug)]
+pub enum DiffIgnoreWhitespaceSetting {
+ None,
+ All,
+ Modified,
+}
diff --git a/src/lib/diff_show_whitespace_setting.rs b/src/lib/diff_show_whitespace_setting.rs
new file mode 100644
index 0000000..baf4609
--- /dev/null
+++ b/src/lib/diff_show_whitespace_setting.rs
@@ -0,0 +1,7 @@
+#[derive(Clone, PartialEq, Debug)]
+pub enum DiffShowWhitespaceSetting {
+ None,
+ Trailing,
+ Laeding,
+ Both,
+}
diff --git a/src/lib/mod.rs b/src/lib/mod.rs
new file mode 100644
index 0000000..110ecab
--- /dev/null
+++ b/src/lib/mod.rs
@@ -0,0 +1,58 @@
+pub mod diff_ignore_whitespace_setting;
+pub mod diff_show_whitespace_setting;
+pub mod git_config;
+pub mod key_bindings;
+pub mod theme;
+mod utils;
+use anyhow::Result;
+
+#[cfg(test)]
+mod tests;
+
+use crate::config::diff_ignore_whitespace_setting::DiffIgnoreWhitespaceSetting;
+use crate::config::diff_show_whitespace_setting::DiffShowWhitespaceSetting;
+use crate::config::git_config::GitConfig;
+use crate::config::key_bindings::KeyBindings;
+use crate::config::theme::Theme;
+use crate::config::utils::{
+ get_bool,
+ get_diff_ignore_whitespace,
+ get_diff_show_whitespace,
+ get_string,
+ get_unsigned_integer,
+ open_git_config,
+};
+
+#[derive(Clone, Debug)]
+pub struct Config {
+ pub(crate) auto_select_next: bool,
+ pub(crate) diff_ignore_whitespace: DiffIgnoreWhitespaceSetting,
+ pub(crate) diff_show_whitespace: DiffShowWhitespaceSetting,
+ pub(crate) diff_tab_width: u32,
+ pub(crate) diff_tab_symbol: String,
+ pub(crate) diff_space_symbol: String,
+ pub(crate) git: GitConfig,
+ pub(crate) key_bindings: KeyBindings,
+ pub(crate) theme: Theme,
+}
+
+impl Config {
+ pub(crate) fn new() -> Result<Self> {
+ let config = open_git_config().map_err(|e| e.context("Error loading git config"))?;
+ Self::new_from_config(&config).map_err(|e| e.context("Error reading git config"))
+ }
+
+ fn new_from_config(git_config: &git2::Config) -> Result<Self> {
+ Ok(Self {
+ auto_select_next: get_bool(git_config, "interactive-rebase-tool.autoSelectNext", false)?,
+ diff_ignore_whitespace: get_diff_ignore_whitespace(git_config)?,
+ diff_show_whitespace: get_diff_show_whitespace(git_config)?,
+ diff_tab_width: get_unsigned_integer(git_config, "interactive-rebase-tool.diffTabWidth", 4)?,
+ diff_tab_symbol: get_string(git_config, "interactive-rebase-tool.diffTabSymbol", "→")?,
+ diff_space_symbol: get_string(git_config, "interactive-rebase-tool.diffSpaceSymbol", "·")?,
+ git: GitConfig::new(git_config)?,
+ key_bindings: KeyBindings::new(git_config)?,
+ theme: Theme::new(git_config)?,
+ })
+ }
+}