From 03988e0cb1b6ba63c334c3a22899d3c162aa6659 Mon Sep 17 00:00:00 2001 From: Charlie Johansson Date: Sat, 14 Sep 2024 00:35:28 +0200 Subject: [PATCH] minor changes and cleanup would be very suprised if netbsd works, version 0.7.6 --- Cargo.lock | 38 ++++++------ Cargo.toml | 4 +- README.md | 13 ++-- src/info.rs | 168 ++++++++++++++++++++++++---------------------------- src/main.rs | 4 +- 5 files changed, 109 insertions(+), 118 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 96c69ee..76b1b22 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -110,9 +110,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.156" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5f43f184355eefb8d17fc948dbecf6c13be3c141f20d834ae842193a448c72a" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libredox" @@ -132,9 +132,9 @@ checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "33ea5043e58958ee56f3e15a90aee535795cd7dfd319846288d93c5b57d85cbe" [[package]] name = "option-ext" @@ -153,9 +153,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] @@ -182,9 +182,9 @@ dependencies = [ [[package]] name = "redox_users" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", @@ -222,7 +222,7 @@ checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "rsftch" -version = "0.7.5" +version = "0.7.6" dependencies = [ "colored", "dirs", @@ -241,18 +241,18 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] name = "serde" -version = "1.0.208" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff085d2cb684faa248efb494c39b68e522822ac0de72ccf08109abde717cfb2" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.208" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24008e81ff7613ed8e5ba0cfaf24e2c2f1e5b8a0495711e44fcd4882fca62bcf" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", @@ -261,9 +261,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.125" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8e735a073ccf5be70aa8066aa984eaf2fa000db6c8d0100ae605b366d31ed" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", "memchr", @@ -273,9 +273,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.74" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fceb41e3d546d0bd83421d3409b1460cc7444cd389341a4c880fe7a042cb3d7" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -304,9 +304,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "wasi" diff --git a/Cargo.toml b/Cargo.toml index c748a9a..8a37a85 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,10 @@ [package] name = "rsftch" -version = "0.7.5" +version = "0.7.6" edition = "2021" authors = ["Charklie charliejohanid@gmail.com"] license = "MIT" -description = "Aesthetically pleasing and lightning fast hardware fetch tool written in rust with pkl configuration." +description = "Aesthetically pleasing and lightning fast hardware fetch tool written in rust with easy configuration." readme = "README.md" repository = "https://github.com/charklie/rsftch" keywords = ["fetch", "rust", "neofetch"] diff --git a/README.md b/README.md index 5ceccdd..c221aa9 100644 --- a/README.md +++ b/README.md @@ -143,9 +143,14 @@ A color which is not supported is parsed as white. Capitalization does *not* matter. ### Known issues -- Temperature readouts sometimes wrong - Icons misaligned in some terminals, some examples include `ansi` and text mode -- Technically wrong syntax in the JSON configuration file, but if serde's fine with it, I am +- Technically wrong syntax in the JSON configuration file, but if serde's fine with it, I'm fine with it +- `tmux` makes terminal readout wrong + +##### On WSL +- Resolution and DE/WM readouts (obviously) don't work in WSL +- Used disk space readout is only the Linux partition, but total disk space is the whole Windows disk +- Sensors doesn't work on WSL so some temperatures will be N/A If you've found a solution of these, please submit a PR. @@ -157,7 +162,7 @@ Bash / Zsh: `echo "PATH=\$PATH:~/.cargo/bin/" >> (.bashrc / .zshrc path)` Fish: -`set -U fish_user_paths ~/.cargo/bin/ $fish_user_paths` +`fish_add_path ~/.cargo/bin/` Nushell: `let-env PATH = ($env.PATH | prepend $"($env.HOME)/.cargo/bin")` @@ -214,4 +219,4 @@ Thank you to: - [X] Rewrite & clean up `packs` function - [ ] MacOS support - [ ] Windows support (?) -- [ ] More BSD support \ No newline at end of file +- [ ] More BSD support diff --git a/src/info.rs b/src/info.rs index b5d4d9b..634e910 100644 --- a/src/info.rs +++ b/src/info.rs @@ -1,5 +1,6 @@ use rayon::prelude::*; use std::{ + collections::HashSet, env, fs::{self, read_to_string, File}, io::{BufRead, BufReader, Error, Read}, @@ -7,7 +8,6 @@ use std::{ process::{Command, Stdio}, sync::{Arc, Mutex}, time::Duration, - collections::HashSet }; #[cfg(target_os = "linux")] @@ -153,17 +153,23 @@ fn gpu_temp() -> String { } } -pub(crate) fn gpu_info() -> Result { +pub(crate) fn gpu_info() -> String { #[cfg(target_os = "linux")] { - let output = Command::new("lspci").arg("-nnk").output()?; + let output = Command::new("lspci") + .arg("-nnk") + .output() + .map(|output| String::from_utf8_lossy(&output.stdout).to_string()) + .unwrap_or_else(|_| format!("N/A {}", gpu_temp())); - let stdout = String::from_utf8_lossy(&output.stdout); - let reader = BufReader::new(stdout.as_bytes()); + let reader = BufReader::new(output.as_bytes()); - for line in reader.lines() { - let line = line?; - if let Some(start_index) = line.find("NVIDIA").or_else(|| line.find("AMD")) { + for line in reader.lines().flatten() { + if let Some(start_index) = line + .find("NVIDIA") + .or_else(|| line.find("AMD")) + .or_else(|| line.find("Intel")) + { let (prefix, prefix_len) = if line.contains("NVIDIA") { ("NVIDIA", "NVIDIA".len()) } else if line.contains("AMD") { @@ -172,34 +178,31 @@ pub(crate) fn gpu_info() -> Result { } else { ("AMD Radeon", "AMD Radeon".len()) } + } else if line.contains("Intel") { + ("Intel Integrated", "Intel Integrated".len()) } else { - let vendor_index = line.find("controller").unwrap_or(0); - let vendor_str = &line[..vendor_index]; - (vendor_str, 0) + ("Unknown Vendor", 0) }; + let start_index = start_index + prefix_len; - let start_index = line[start_index..].find('[').ok_or(Error::new( - std::io::ErrorKind::NotFound, - "GPU name not found", - ))? + start_index - + 1; - let end_index = line[start_index..].find(']').ok_or(Error::new( - std::io::ErrorKind::NotFound, - "GPU name not found", - ))? + start_index; + let start_index = line[start_index..].find('[').unwrap_or(0) + start_index + 1; + let end_index = line[start_index..].find(']').unwrap_or(0) + start_index; + let gpu_name = &line[start_index..end_index]; - return Ok(format!("{} {} {}", prefix, gpu_name.trim(), gpu_temp())); + return format!("{} {} {}", prefix, gpu_name.trim(), gpu_temp()); } } - Err(Error::new(std::io::ErrorKind::NotFound, "GPU not found")) + format!("N/A {}", gpu_temp()) } + #[cfg(target_os = "netbsd")] { - let output = Command::new("pcictl").args(&["pci0", "list"]).output()?; - let output_str = String::from_utf8_lossy(&output.stdout); - - let formatted_str = output_str + let formatted_str = Command::new("pcictl") + .args(&["pci0", "list"]) + .output() + .map(|output| String::from_utf8_lossy(&output.stdout).to_string()) + .unwrap_or_else(|_| format!("N/A {}", gpu_temp())) .lines() .find(|&l| l.contains("VGA display")) .and_then(|l| l.rsplitn(2, ':').next()) @@ -209,11 +212,10 @@ pub(crate) fn gpu_info() -> Result { .0 .trim() .to_string() - }); + }) + .unwrap_or_else(|| format!("N/A {}", gpu_info())); - formatted_str - .map(|name| format!("{} {}", name, gpu_temp())) - .ok_or_else(|| Error::new(std::io::ErrorKind::NotFound, "GPU not found")) + format!("{} {}", formatted_str, gpu_temp()) } } @@ -222,7 +224,7 @@ pub(crate) fn disk_usage() -> String { Ok(output) if output.status.success() => { String::from_utf8(output.stdout).unwrap_or_default() } - _ => return String::new(), + _ => return String::from("N/A"), }; let line = output_str.lines().find(|line| line.starts_with('/')); @@ -311,67 +313,45 @@ fn package_managers() -> Vec { .collect() } -fn count_packages(manager: &str, args: &[&str], stdin_cmd: Option<&str>) -> Option { - let output = if let Some(stdin_cmd) = stdin_cmd { - Command::new(stdin_cmd) - .args(args) - .stdout(Stdio::piped()) - .spawn() - .and_then(|child| { - Command::new("wc") - .args(["-l"]) - .stdin(child.stdout.unwrap()) - .output() - }) - } else { - Command::new(manager) - .args(args) - .stdout(Stdio::piped()) - .spawn() - .and_then(|child| { - Command::new("wc") - .args(["-l"]) - .stdin(child.stdout.unwrap()) - .output() - }) - }; +fn count_packages(command: &str, args: &[&str]) -> Option { + let mut cmd = Command::new(command) + .args(args) + .stdout(Stdio::piped()) + .spawn() + .ok()?; - output.ok().and_then(|output| { - if output.status.success() { - String::from_utf8(output.stdout) - .ok() - .and_then(|count_str| count_str.trim().parse::().ok()) - } else { - None - } - }) + let output = cmd.stdout.take()?; + let reader = BufReader::new(output); + let line_count = reader.lines().count() as i16; + + let _ = cmd.wait().ok()?; + Some(line_count) } pub(crate) fn packages() -> String { - let installed_managers = package_managers(); + let managers = package_managers(); let packs_numbers = Arc::new(Mutex::new(Vec::new())); - installed_managers.par_iter().for_each(|manager| { + managers.par_iter().for_each(|manager| { let count = match manager.as_str() { - "xbps-query" => count_packages(manager, &["-l"], None), - "dnf" => count_packages(manager, &["list", "installed"], None), - "rpm" => count_packages(manager, &["-qa", "--last"], None), - "apt" => count_packages("dpkg", &["--get-selections"], Some("grep -w install")), - "pacman" => count_packages(manager, &["-Q"], None), - "yum" => count_packages(manager, &["list", "installed"], None), - "zypper" => count_packages(manager, &["se"], None), - "apk" => count_packages(manager, &["list", "--installed"], None), - "pkg_info" => count_packages("ls", &["/usr/pkg/pkgdb/"], None).map(|x| x - 1), - "pkg" => count_packages("pkg", &["info"], None), + "xbps-query" => count_packages(manager, &["-l"]), + "dnf" | "yum" => count_packages(manager, &["list", "installed"]), + "rpm" => count_packages(manager, &["-qa", "--last"]), + "apt" => count_packages("dpkg", &["--list"]), + "pacman" => count_packages(manager, &["-Q"]), + "zypper" => count_packages(manager, &["se"]), + "apk" => count_packages(manager, &["list", "--installed"]), + "pkg_info" => count_packages("ls", &["/usr/pkg/pkgdb/"]).map(|x| x - 1), + "pkg" => count_packages(manager, &["info"]), "emerge" => { if os_pretty_name(None, "ID") .unwrap_or_default() .to_ascii_lowercase() .contains("funtoo") { - count_packages("find", &["/var/db/pkg/", "-name", "PF"], None) + count_packages("find", &["/var/db/pkg/", "-name", "PF"]) } else { - count_packages(manager, &["-I"], None) + count_packages(manager, &["-I"]) } } _ => None, @@ -382,14 +362,18 @@ pub(crate) fn packages() -> String { } }); - let total_packages: i16 = packs_numbers.lock().unwrap().par_iter().sum(); - total_packages.to_string() + let summed: i16 = packs_numbers.lock().unwrap().par_iter().sum(); + + match managers.is_empty() { + false => format!("{} ({})", summed, managers.join(", ")), + true => String::from("N/A"), + } } pub(crate) fn res() -> String { let output = match Command::new("xrandr").arg("--query").output() { Ok(out) => out, - Err(_err) => return String::new(), + Err(_) => return String::from("N/A"), }; String::from_utf8_lossy(&output.stdout) @@ -410,23 +394,25 @@ pub(crate) fn res() -> String { .join(", ") } -pub(crate) fn uptime() -> Result { - let file = File::open("/proc/uptime").expect("Failed to open /proc/uptime"); - let mut reader = BufReader::new(file); +pub(crate) fn uptime() -> String { let mut line = String::new(); - reader - .read_line(&mut line) - .expect("Failed to read from /proc/uptime"); + File::open("/proc/uptime") + .map_err(|_| "NA".to_string()) + .and_then(|file| { + BufReader::new(file) + .read_line(&mut line) + .map_err(|_| "N/A".to_string()) + }) + .ok(); let uptime_secs: f64 = line .split_whitespace() .next() - .expect("Failed to parse uptime from /proc/uptime") - .parse() - .expect("Failed to parse uptime as f64"); + .and_then(|val| val.parse().ok()) + .unwrap_or_default(); - Ok(format_duration(Duration::from_secs_f64(uptime_secs))) + format_duration(Duration::from_secs_f64(uptime_secs)).to_string() } fn format_duration(duration: Duration) -> String { diff --git a/src/main.rs b/src/main.rs index 727419b..b6f7601 100644 --- a/src/main.rs +++ b/src/main.rs @@ -163,13 +163,13 @@ fn get_info_vecs( let uptime = InfoItem { title: "uptime", icon: "󰄉", - value: Arc::new(move || uptime().unwrap_or_default()), + value: Arc::new(move || uptime()), }; let gpu = InfoItem { title: "gpu", icon: "󰍹", - value: Arc::new(move || gpu_info().unwrap_or_default()), + value: Arc::new(move || gpu_info()), }; let disk = InfoItem {