Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Give me the choice between easier configuration and slightly faster performance #25

Open
SIGSTACKFAULT opened this issue Sep 12, 2023 · 1 comment

Comments

@SIGSTACKFAULT
Copy link

I want my config to be easy to install.
It would be much more convenient if I could have a file like ~/.config/powerline-rust.yaml.

Proposal: Look for a config file at runtime and use it if present, otherwise use compiled-in default prompt. Checking if a file exists should take negligible time and i'm pretty sure the kernel caches it.

Optional: have a feature which decides whether it even looks for a config file at runtime

If you want the slight speed advantage of a compile-time prompt, then you can compile your prompt in and not have a config file. If you want the easyness of a config file, you can just use the file.

@SIGSTACKFAULT
Copy link
Author

SIGSTACKFAULT commented Sep 13, 2023

Threw this together in like two hours. full of placeholders but gets what i mean across

# $HOME/.config/powerline-rust.yaml
segments:
  - user
  - host
  - cwd:
      max_length: 20
      wanted_seg_num: 4
      resolve_symlinks: false
  - git
diff --git a/Cargo.lock b/Cargo.lock
index 3472541..35fe596 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -186,6 +186,12 @@ dependencies = [
  "vcpkg",
 ]
 
+[[package]]
+name = "linked-hash-map"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
+
 [[package]]
 name = "log"
 version = "0.4.20"
@@ -234,6 +240,7 @@ dependencies = [
  "hostname",
  "libc",
  "users",
+ "yaml-rust",
 ]
 
 [[package]]
@@ -486,3 +493,12 @@ name = "windows_x86_64_msvc"
 version = "0.48.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+
+[[package]]
+name = "yaml-rust"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
+dependencies = [
+ "linked-hash-map",
+]
diff --git a/Cargo.toml b/Cargo.toml
index a7656c6..ff5c830 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -10,6 +10,7 @@ libc = "0.2"
 hostname = "0.3"
 git2 = { version = "0.18", optional = true, default-features = false }
 chrono = { version = "0.4.29", optional = true }
+yaml-rust = "0.4.5"
 
 [features]
 default = ["bash-shell", "libgit"]
diff --git a/src/bin/powerline.rs b/src/bin/powerline.rs
index 416c241..3178ed5 100644
--- a/src/bin/powerline.rs
+++ b/src/bin/powerline.rs
@@ -4,8 +4,24 @@ extern crate powerline;
 use powerline::modules::Time;
 use powerline::modules::*;
 use powerline::theme::SimpleTheme;
+use powerline::Powerline;
+use std::env;
+use std::fs;
+use yaml_rust::Yaml;
+use yaml_rust::YamlLoader;
 
 fn main() {
+    let config_file = config_file().unwrap();
+    println!("config_file {}", config_file);
+    let prompt: Powerline = match prompt_from_file(&config_file) {
+        Some(prompt) => prompt,
+        None => default_prompt(),
+    };
+
+    println!("{} ", prompt)
+}
+
+fn default_prompt() -> Powerline {
     let mut prompt = powerline::Powerline::new();
 
     #[cfg(feature = "time")]
@@ -19,6 +35,45 @@ fn main() {
     prompt.add_module(Cmd::<SimpleTheme>::new());
     // prompt.add_module(VirtualEnv::<SimpleTheme>::new())?;
     // prompt.add_module(ExitCode::<SimpleTheme>::new())?;
+    return prompt;
+}
 
-    println!("{} ", prompt);
+/**
+ * Get the config file we should use
+ * checks $XDG_CONFIG_HOME, then $HOME/.config/
+ */
+fn config_file() -> Option<String> {
+    let xdg_config_home = env::var("XDG_CONFIG_HOME");
+    let home = env::var("HOME");
+    match xdg_config_home {
+        Ok(path) => Some(path + "powerline-rust.yaml"),
+        Err(_) => match home {
+            Ok(path) => Some(path + "/.config/powerline-rust.yaml"),
+            Err(_) => None,
+        },
+    }
+}
+
+fn prompt_from_file(filename: &str) -> Option<Powerline> {
+    let mut prompt = powerline::Powerline::new();
+    // prompt.add_module(Cwd::<SimpleTheme>::new(10, 2, false));
+    let contents = fs::read_to_string(filename).ok()?;
+    let docs = YamlLoader::load_from_str(&contents).ok()?;
+    let doc = &docs.get(0)?;
+    let segments = doc["segments"].as_vec()?;
+    for segment in segments.iter() {
+        println!("segment {:?}", segment);
+        match segment {
+            Yaml::String(s) => match s.as_str() {
+                "host" => prompt.add_module(Host::<SimpleTheme>::new()),
+                "user" => prompt.add_module(User::<SimpleTheme>::new()),
+                "git" => prompt.add_module(Git::<SimpleTheme>::new()),
+                _ => panic!(),
+            },
+            _ => {
+                println!("todo: {:?}", segment);
+            },
+        }
+    }
+    return Some(prompt);
 }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant