summaryrefslogtreecommitdiffstats
path: root/src/git_config/git_config.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/git_config/git_config.rs')
-rw-r--r--src/git_config/git_config.rs101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/git_config/git_config.rs b/src/git_config/git_config.rs
new file mode 100644
index 00000000..ab831b31
--- /dev/null
+++ b/src/git_config/git_config.rs
@@ -0,0 +1,101 @@
+#[cfg(test)]
+use std::path::Path;
+use std::process;
+
+pub struct GitConfig {
+ config: git2::Config,
+ pub enabled: bool,
+ pub repo: Option<git2::Repository>,
+}
+
+impl GitConfig {
+ pub fn try_create() -> Option<Self> {
+ let repo = match std::env::current_dir() {
+ Ok(dir) => git2::Repository::discover(dir).ok(),
+ _ => None,
+ };
+ let config = match &repo {
+ Some(repo) => repo.config().ok(),
+ None => git2::Config::open_default().ok(),
+ };
+ match config {
+ Some(mut config) => {
+ let config = config.snapshot().unwrap_or_else(|err| {
+ eprintln!("Failed to read git config: {}", err);
+ process::exit(1)
+ });
+ Some(Self {
+ config,
+ repo,
+ enabled: true,
+ })
+ }
+ None => None,
+ }
+ }
+
+ #[cfg(test)]
+ pub fn from_path(path: &Path) -> Self {
+ Self {
+ config: git2::Config::open(path).unwrap(),
+ repo: None,
+ enabled: true,
+ }
+ }
+
+ pub fn get<T>(&self, key: &str) -> Option<T>
+ where
+ T: GitConfigGet,
+ {
+ if self.enabled {
+ T::git_config_get(key, self)
+ } else {
+ None
+ }
+ }
+}
+
+pub trait GitConfigGet {
+ fn git_config_get(key: &str, git_config: &GitConfig) -> Option<Self>
+ where
+ Self: Sized;
+}
+
+impl GitConfigGet for String {
+ fn git_config_get(key: &str, git_config: &GitConfig) -> Option<Self> {
+ git_config.config.get_string(key).ok()
+ }
+}
+
+impl GitConfigGet for Option<String> {
+ fn git_config_get(key: &str, git_config: &GitConfig) -> Option<Self> {
+ match git_config.config.get_string(key) {
+ Ok(value) => Some(Some(value)),
+ _ => None,
+ }
+ }
+}
+
+impl GitConfigGet for bool {
+ fn git_config_get(key: &str, git_config: &GitConfig) -> Option<Self> {
+ git_config.config.get_bool(key).ok()
+ }
+}
+
+impl GitConfigGet for usize {
+ fn git_config_get(key: &str, git_config: &GitConfig) -> Option<Self> {
+ match git_config.config.get_i64(key) {
+ Ok(value) => Some(value as usize),
+ _ => None,
+ }
+ }
+}
+
+impl GitConfigGet for f64 {
+ fn git_config_get(key: &str, git_config: &GitConfig) -> Option<Self> {
+ match git_config.config.get_string(key) {
+ Ok(value) => value.parse::<f64>().ok(),
+ _ => None,
+ }
+ }
+}