You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

86 lines
2.0 KiB

use colored::Colorize;
use std::env;
use whoami::{hostname, username};
#[derive(Clone)]
pub enum PromptStyle {
Default,
SimpleDirectory,
BashLike,
}
impl PromptStyle {
pub fn fmt_style(&self) -> String {
match self {
PromptStyle::Default => self.fmt_default(),
PromptStyle::SimpleDirectory => self.fmt_simple_directory(),
PromptStyle::BashLike => self.fmt_bash_like(),
}
}
fn fmt_default(&self) -> String {
let current = env::current_dir().unwrap_or_default();
let home = dirs::home_dir().unwrap_or_default();
let dir = if current.starts_with(home.clone()) {
let mut path = "~/".to_string();
path.push_str(
current
.as_path()
.strip_prefix(home)
.unwrap()
.to_str()
.unwrap_or_default(),
);
path
} else {
current.into_os_string().into_string().unwrap_or_default()
};
format!(
"\n{}\n{} ",
dir.bright_cyan().bold(),
"»".bright_green().bold()
)
}
fn fmt_simple_directory(&self) -> String {
let path = env::current_dir().unwrap_or_default();
format!("{} » ", path.to_string_lossy())
}
fn fmt_bash_like(&self) -> String {
let path = env::current_dir().unwrap_or_default();
let home = dirs::home_dir().unwrap_or_default();
let dir_as_string = if path == home {
"~"
} else {
path.file_name()
.unwrap_or_default()
.to_str()
.unwrap_or_default()
};
format!("[{}@{} {}]$ ", username(), hostname(), dir_as_string)
}
}
pub struct Prompt {
pub style: PromptStyle,
}
impl Prompt {
pub fn new() -> Self {
Self {
style: PromptStyle::Default,
}
}
pub fn get_prompt(&mut self) -> String {
self.style.fmt_style()
}
}