Compare commits
2 Commits
v0.1.0
...
098b53744d
| Author | SHA1 | Date | |
|---|---|---|---|
| 098b53744d | |||
| 960bc60b20 |
Generated
+5
-5
@@ -82,9 +82,9 @@ checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.58"
|
||||
version = "1.2.59"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1"
|
||||
checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"shlex",
|
||||
@@ -144,7 +144,7 @@ checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570"
|
||||
|
||||
[[package]]
|
||||
name = "corsairctl"
|
||||
version = "0.1.0"
|
||||
version = "0.1.1"
|
||||
dependencies = [
|
||||
"alsa",
|
||||
"clap",
|
||||
@@ -192,9 +192,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.183"
|
||||
version = "0.2.184"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d"
|
||||
checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "corsairctl"
|
||||
version = "0.1.0"
|
||||
version = "0.1.1"
|
||||
edition = "2024"
|
||||
description = "CLI tool for Corsair Bragi-protocol devices (HS80, etc.)"
|
||||
license = "MIT"
|
||||
|
||||
+2
-1
@@ -58,7 +58,8 @@ fn run() -> error::Result<()> {
|
||||
let device = bragi::BragiDevice::open_with_verbose(cli.verbose)?;
|
||||
let level = device.battery_level()?;
|
||||
let status = device.battery_status()?;
|
||||
println!("{}", output::format_waybar_json(level, &status));
|
||||
let sidetone = sidetone::get_level().ok();
|
||||
println!("{}", output::format_waybar_json(level, &status, sidetone));
|
||||
}
|
||||
|
||||
Command::Udev => {
|
||||
|
||||
+7
-2
@@ -26,7 +26,7 @@ pub fn format_info(vid: u16, pid: u16, fw_app: u16, fw_build: u16) -> String {
|
||||
/// Formatiert Waybar-kompatibles JSON.
|
||||
///
|
||||
/// Waybar erwartet: {"text": "...", "tooltip": "...", "class": "...", "percentage": N}
|
||||
pub fn format_waybar_json(level: f32, status: &BatteryStatus) -> String {
|
||||
pub fn format_waybar_json(level: f32, status: &BatteryStatus, sidetone: Option<i64>) -> String {
|
||||
let icon = status.icon();
|
||||
let label = status.label();
|
||||
let percentage = level.round() as u32;
|
||||
@@ -41,9 +41,14 @@ pub fn format_waybar_json(level: f32, status: &BatteryStatus) -> String {
|
||||
BatteryStatus::Unknown(_) => "unknown",
|
||||
};
|
||||
|
||||
let tooltip = match sidetone {
|
||||
Some(st) => format!("HS80: {percentage}% — {label} | Sidetone: {st}/23"),
|
||||
None => format!("HS80: {percentage}% — {label}"),
|
||||
};
|
||||
|
||||
let json = serde_json::json!({
|
||||
"text": format!("{icon} {percentage}%"),
|
||||
"tooltip": format!("HS80: {percentage}% — {label}"),
|
||||
"tooltip": tooltip,
|
||||
"class": class,
|
||||
"percentage": percentage,
|
||||
});
|
||||
|
||||
+28
-12
@@ -45,14 +45,14 @@ fn format_info_values() {
|
||||
|
||||
#[test]
|
||||
fn waybar_json_is_valid_json() {
|
||||
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Discharging);
|
||||
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Discharging, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).expect("muss valides JSON sein");
|
||||
assert!(parsed.is_object());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn waybar_json_has_required_fields() {
|
||||
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Discharging);
|
||||
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Discharging, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
assert!(parsed["text"].is_string(), "text fehlt");
|
||||
assert!(parsed["tooltip"].is_string(), "tooltip fehlt");
|
||||
@@ -62,56 +62,56 @@ fn waybar_json_has_required_fields() {
|
||||
|
||||
#[test]
|
||||
fn waybar_json_percentage_matches_level() {
|
||||
let json_str = output::format_waybar_json(73.5, &BatteryStatus::Discharging);
|
||||
let json_str = output::format_waybar_json(73.5, &BatteryStatus::Discharging, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
assert_eq!(parsed["percentage"], 74); // 73.5 rounded
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn waybar_json_class_charging() {
|
||||
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Charging);
|
||||
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Charging, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
assert_eq!(parsed["class"], "charging");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn waybar_json_class_fully_charged() {
|
||||
let json_str = output::format_waybar_json(100.0, &BatteryStatus::FullyCharged);
|
||||
let json_str = output::format_waybar_json(100.0, &BatteryStatus::FullyCharged, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
assert_eq!(parsed["class"], "charging");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn waybar_json_class_low() {
|
||||
let json_str = output::format_waybar_json(20.0, &BatteryStatus::Low);
|
||||
let json_str = output::format_waybar_json(20.0, &BatteryStatus::Low, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
assert_eq!(parsed["class"], "low");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn waybar_json_class_critical_when_discharging_below_15() {
|
||||
let json_str = output::format_waybar_json(10.0, &BatteryStatus::Discharging);
|
||||
let json_str = output::format_waybar_json(10.0, &BatteryStatus::Discharging, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
assert_eq!(parsed["class"], "critical");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn waybar_json_class_warning_when_discharging_below_30() {
|
||||
let json_str = output::format_waybar_json(25.0, &BatteryStatus::Discharging);
|
||||
let json_str = output::format_waybar_json(25.0, &BatteryStatus::Discharging, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
assert_eq!(parsed["class"], "warning");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn waybar_json_class_normal_when_discharging_above_30() {
|
||||
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Discharging);
|
||||
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Discharging, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
assert_eq!(parsed["class"], "normal");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn waybar_json_class_at_boundary_15() {
|
||||
let json_str = output::format_waybar_json(15.0, &BatteryStatus::Discharging);
|
||||
let json_str = output::format_waybar_json(15.0, &BatteryStatus::Discharging, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
// 15.0 ist <= 15.0 → critical
|
||||
assert_eq!(parsed["class"], "critical");
|
||||
@@ -119,7 +119,7 @@ fn waybar_json_class_at_boundary_15() {
|
||||
|
||||
#[test]
|
||||
fn waybar_json_class_at_boundary_30() {
|
||||
let json_str = output::format_waybar_json(30.0, &BatteryStatus::Discharging);
|
||||
let json_str = output::format_waybar_json(30.0, &BatteryStatus::Discharging, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
// 30.0 ist <= 30.0 → warning
|
||||
assert_eq!(parsed["class"], "warning");
|
||||
@@ -127,7 +127,23 @@ fn waybar_json_class_at_boundary_30() {
|
||||
|
||||
#[test]
|
||||
fn waybar_json_offline() {
|
||||
let json_str = output::format_waybar_json(0.0, &BatteryStatus::Offline);
|
||||
let json_str = output::format_waybar_json(0.0, &BatteryStatus::Offline, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
assert_eq!(parsed["class"], "offline");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn waybar_json_tooltip_without_sidetone() {
|
||||
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Discharging, None);
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
let tooltip = parsed["tooltip"].as_str().unwrap();
|
||||
assert!(!tooltip.contains("Sidetone"), "tooltip should not contain sidetone when None");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn waybar_json_tooltip_with_sidetone() {
|
||||
let json_str = output::format_waybar_json(50.0, &BatteryStatus::Discharging, Some(10));
|
||||
let parsed: serde_json::Value = serde_json::from_str(&json_str).unwrap();
|
||||
let tooltip = parsed["tooltip"].as_str().unwrap();
|
||||
assert!(tooltip.contains("Sidetone: 10/23"), "tooltip should contain sidetone value");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user