some initial work
This commit is contained in:
commit
f8a029545b
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/target
|
11
Cargo.toml
Normal file
11
Cargo.toml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
[package]
|
||||||
|
name = "make_prompt_rust"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "make_prompt"
|
||||||
|
path = "src/make_prompt.rs"
|
8
source.sh
Normal file
8
source.sh
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
bin_path=$(pwd)/target/debug/make_prompt
|
||||||
|
|
||||||
|
PROMPT_COMMAND='make_prompt'
|
||||||
|
|
||||||
|
make_prompt () {
|
||||||
|
local prompt_pref=$($bin_path $?)
|
||||||
|
PS1="$prompt_pref"
|
||||||
|
}
|
136
src/make_prompt.rs
Normal file
136
src/make_prompt.rs
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::Read;
|
||||||
|
|
||||||
|
fn fixed_width(input: &String, len: usize) -> String
|
||||||
|
{
|
||||||
|
let clen = input.len();
|
||||||
|
const PLACE_HOLDER: &str = "🤄";
|
||||||
|
|
||||||
|
if clen > len
|
||||||
|
{
|
||||||
|
let cut_to = len - 2_usize;
|
||||||
|
let start_from = clen - cut_to;
|
||||||
|
let cutted_result = &input[start_from..];
|
||||||
|
let mut result: String = cutted_result.to_owned();
|
||||||
|
|
||||||
|
result.push_str(&PLACE_HOLDER);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
let n_pad = len - clen;
|
||||||
|
let n_pad_left = n_pad / 2;
|
||||||
|
let n_pad_right = n_pad_left + { if n_pad % 2 == 0 {0} else {1}};
|
||||||
|
let mut result: String = str::repeat(" ", n_pad_left).to_owned();
|
||||||
|
result.push_str(input);
|
||||||
|
result.push_str(&str::repeat(" ", n_pad_right));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn battery_info(width_to: usize) -> String
|
||||||
|
{
|
||||||
|
const BATTERY_DIR: &str = "/sys/class/power_supply/BAT0/";
|
||||||
|
const SYMB_POWER: &str = "↯";
|
||||||
|
const SYMB_BATT: &str = "🔋";
|
||||||
|
|
||||||
|
let bat_path = std::path::Path::new(BATTERY_DIR);
|
||||||
|
|
||||||
|
if !bat_path.exists()
|
||||||
|
{
|
||||||
|
return fixed_width(&String::from(SYMB_POWER), width_to);
|
||||||
|
}
|
||||||
|
|
||||||
|
let capacity_path = bat_path.join("capacity");
|
||||||
|
let mut file = match File::open(&capacity_path) {
|
||||||
|
Err(why) => panic!("couldn't open {}: {}", capacity_path.display(), why),
|
||||||
|
Ok(file) => file,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
let mut percentage = String::new();
|
||||||
|
let _ = file.read_to_string(&mut percentage);
|
||||||
|
|
||||||
|
let status_path = bat_path.join("status");
|
||||||
|
let mut file = match File::open(&status_path) {
|
||||||
|
Err(why) => panic!("couldn't open {}: {}", status_path.display(), why),
|
||||||
|
Ok(file) => file,
|
||||||
|
};
|
||||||
|
let mut status = String::new();
|
||||||
|
let _ = file.read_to_string(&mut status);
|
||||||
|
|
||||||
|
if status.contains("Charging") || status.contains("Full")
|
||||||
|
{
|
||||||
|
fixed_width(&format!("{SYMB_POWER} {percentage}%"), width_to + 1)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fixed_width(&format!("{SYMB_BATT} {percentage}%"), width_to)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn shell_color_str<T: std::fmt::Display>(string_in: &T, color: &str) -> String
|
||||||
|
{
|
||||||
|
format!("\x1b[{color}m{string_in}\x1b[00m")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn main()
|
||||||
|
{
|
||||||
|
const SH_GREEN: &str = "1;32";
|
||||||
|
const SH_RED: &str = "01;31";
|
||||||
|
const SH_YELLOW: &str = "01;33";
|
||||||
|
const SH_PURPLE: &str = "01;35";
|
||||||
|
const SH_CYAN: &str = "01;36";
|
||||||
|
|
||||||
|
|
||||||
|
let args: Vec<String> = std::env::args().collect();
|
||||||
|
|
||||||
|
let default_lastexit = String::from("0");
|
||||||
|
let cpu_arch = String::from(std::env::consts::ARCH);
|
||||||
|
|
||||||
|
let lastexit = {
|
||||||
|
if args.len() <= 1
|
||||||
|
{
|
||||||
|
&default_lastexit
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
&args[1]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let cwd = {
|
||||||
|
if args.len() <= 2
|
||||||
|
{
|
||||||
|
let promise = std::env::current_dir();
|
||||||
|
match promise
|
||||||
|
{
|
||||||
|
Ok(v) => v.display().to_string(),
|
||||||
|
Err(_reason) => panic!("failed to get cwd")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
args[2].to_string()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
print!("\n");
|
||||||
|
{
|
||||||
|
print!("{}{}", shell_color_str(&"┌[", SH_GREEN), battery_info(12));
|
||||||
|
println!("{}", shell_color_str(&"]", SH_GREEN));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
print!("{}", shell_color_str(&"╞[", SH_GREEN));
|
||||||
|
println!("{}", shell_color_str(&"]", SH_GREEN));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
print!("{} {}", shell_color_str(&"╞>", SH_GREEN)
|
||||||
|
, shell_color_str(&cwd, SH_YELLOW));
|
||||||
|
println!("");
|
||||||
|
|
||||||
|
}
|
||||||
|
{
|
||||||
|
print!("{} {}", shell_color_str(&"└", SH_GREEN), shell_color_str(&"$", SH_PURPLE));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user