diff --git a/src/indicators/error.rs b/src/indicators/error.rs index 56a5a7c..5ce1992 100644 --- a/src/indicators/error.rs +++ b/src/indicators/error.rs @@ -1,17 +1,16 @@ use ansi_term::ANSIGenericString; use ansi_term::Colour::RGB; -// Error indicator symbol -pub const ERR_SYMBOL: &str = "\u{276F}"; // "❯" -pub const ERR_COL: ansi_term::Colour = RGB(255, 53, 94); // -pub const NORMIE_COL: ansi_term::Colour = RGB(0, 255, 180); // +pub const ERR_SYMBOL: &str = "\u{276F}"; // Error indicator symbol: "❯" +pub const ERR_COL: ansi_term::Colour = RGB(255, 53, 94); // Error +pub const NORMIE_COL: ansi_term::Colour = RGB(0, 255, 180); // Success // Error indicator -pub fn indicator(args: Vec) -> ANSIGenericString<'static, str> { - let default_exit_code = "0".to_string(); - let exit_code = args.get(1).unwrap_or(&default_exit_code); // Default to "0" if missing - match exit_code.as_str() { - "0" => NORMIE_COL.paint(ERR_SYMBOL), - _ => ERR_COL.paint(ERR_SYMBOL), +pub fn indicator(args: &[String]) -> ANSIGenericString<'static, str> { + let exit_code = args.get(1).map_or("0", String::as_str); // Default to "0" (success, no error) if arg missing + if exit_code == "0" { + NORMIE_COL.paint(ERR_SYMBOL) // Success + } else { + ERR_COL.paint(ERR_SYMBOL) // Error } } diff --git a/src/indicators/git.rs b/src/indicators/git.rs index bef62fd..2425808 100644 --- a/src/indicators/git.rs +++ b/src/indicators/git.rs @@ -12,25 +12,18 @@ pub const NORMIE_COL: ansi_term::Colour = RGB(255, 255, 255); // White pub fn info() -> Option<(String, String)> { let output = Command::new("git") - .arg("rev-parse") - .arg("--show-toplevel") // Repo root - .arg("--abbrev-ref") // Git branch - .arg("HEAD") - .output(); - match output { - Ok(output) if output.status.success() => { - let stdout = String::from_utf8_lossy(&output.stdout); // Get cmd output - let output_string = stdout.trim(); - let parts: Vec<&str> = output_string.split('\n').collect(); + .args(["rev-parse", "--show-toplevel", "--abbrev-ref", "HEAD"]) + .output() + .ok()?; - if parts.len() == 2 { - Some((parts[0].to_string(), parts[1].to_string())) - } else { - None - } + if output.status.success() { + let output_str = String::from_utf8_lossy(&output.stdout).trim().to_string(); + let parts: Vec<&str> = output_str.split('\n').collect(); + if parts.len() == 2 { + return Some((parts[0].to_string(), parts[1].to_string())); } - _ => None, } + None } pub fn repo_name(path: &str) -> String { diff --git a/src/indicators/pwd.rs b/src/indicators/pwd.rs index d71e76c..11a5c45 100644 --- a/src/indicators/pwd.rs +++ b/src/indicators/pwd.rs @@ -7,10 +7,12 @@ pub const UNKNOWN_PATH: &str = "\u{2248}"; // "≈" pub const PATH_COL: ansi_term::Colour = RGB(82, 82, 82); pub const REPO_COL: ansi_term::Colour = RGB(55, 120, 130); +/// Find the current user's home directory. fn home_dir() -> String { - std::env::var("HOME").map_or_else(|_| "".to_string(), |path| path.to_string()) + std::env::var("HOME").map_or_else(|_| String::new(), |path| path.to_string()) } +/// Returns the full path of the current directory as a string. fn full_path() -> String { current_dir().map_or_else( |_| UNKNOWN_PATH.to_string(), @@ -18,10 +20,12 @@ fn full_path() -> String { ) } +/// Remove the path of the repo's root from the path, to replace it with the repo's name. fn remove_repo(pwd_path: &str, repo_path: &str) -> String { pwd_path.replacen(repo_path, "", 1) } +/// Replace the 'home directory' part of the path with a the '~' symbol fn replace_home(path: &str) -> String { let homedir = home_dir(); path.replacen(&homedir, "~", 1) @@ -34,13 +38,13 @@ fn short(path: &str, slash_limit: u8) -> String { } else { // Long path, shorten it let parts: Vec<&str> = path.split('/').collect(); // Split the path into parts - let first = if path.starts_with("~") { "~" } else { "" }; // Determine the first part correctly + let first = if path.starts_with('~') { "~" } else { "" }; // Determine the first part correctly let last = parts[parts.len() - 1]; // The last part // Abbreviate middle parts (take the first character of each) let abbreviated_middle: Vec = parts[1..parts.len() - 1] // Skip the first and last part .iter() - .filter(|&&part| !part.is_empty()) // Avoid empty parts (like after "/") + .filter(|&&part| !part.is_empty()) // Avoid empty parts (like "//") .map(|&part| part.chars().next().unwrap().to_string()) // Take the first letter .collect(); diff --git a/src/main.rs b/src/main.rs index 5bee6b5..041833c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -46,7 +46,8 @@ fn main() { components.push(user::indicator()); } if indicate_err { - components.push(error::indicator(cmd_args)); + //components.push(error::indicator(cmd_args)); + components.push(error::indicator(&cmd_args)); } if show_pwd { let repo_path = match git_info { diff --git a/src/old/main.bkp.rs b/src/old/main.bkp.rs deleted file mode 100644 index df3d877..0000000 --- a/src/old/main.bkp.rs +++ /dev/null @@ -1,55 +0,0 @@ -//use colored::{ColoredString, Colorize}; -use colored::Colorize; -use std::env::{args, current_dir, var_os}; - -mod indicators { - pub mod error; - pub mod git; - pub mod path; - pub mod shell; - pub mod ssh; - pub mod user; -} -use crate::indicators::{error::*, git::*, path::*, shell::*, ssh::*, user::*}; - -fn main() -> std::io::Result<()> { - //let angle = "❯"; - - let args: Vec = args().collect(); - let shell: String = shell(args.clone()); - - let root_indicator = root_indicator(); - - let err: String = err(args.clone()); - let err_indicator = err_indicator(err); - - // SSH status - let ssh_char = ssh_char(); - - //Git status - let git_branch = get_git_branch(); - let git_repo_root = get_git_root(); - let git_repo_name = get_git_repo_name(&git_repo_root.clone()).truecolor(122, 68, 24); - let git_char = get_git_char(&git_branch); - - //pwd - let homedir = homedir(); - let pwd = current_dir()?; - let mut cur_dir = pwd.display().to_string(); - cur_dir = cur_dir.replace(&git_repo_root, ""); // Remove git repo root - cur_dir = cur_dir.replace(&homedir, "~"); // Abreviate homedir with "~" - cur_dir = abrev_path(&cur_dir); - - print!( - "{}{}{}{}{}{}{} ", - ssh_char, - get_shell_char(&shell).truecolor(75, 75, 75), - git_repo_name, - git_char, - cur_dir.italic().truecolor(82, 82, 82), - root_indicator, - err_indicator, - ); - - Ok(()) -} diff --git a/src/old/shell.rs b/src/old/shell.rs deleted file mode 100644 index 513ea28..0000000 --- a/src/old/shell.rs +++ /dev/null @@ -1,20 +0,0 @@ -pub fn get_shell_char(shell: &str) -> String { - let shell_char = match shell { - "bash" | "/bin/bash" | "/usr/bin/bash" | "-bash" => " ", - "zsh" | "/bin/zsh" | "/usr/bin/zsh" | "-zsh" => "󰰶 ", - "fish" => "󰈺 ", - "nushell" => " ", - "ion" => " ", - "oursh" => "󱢇 ", - _ => "󱆃 ", - }; - shell_char.to_string() -} - -pub fn shell(args: Vec) -> String { - if args.len() > 1 { - args[1].clone() // Shell symbol - } else { - "none".to_string() - } -}