master
1use log::error;
2use starship_battery as battery;
3
4#[repr(C)]
5#[derive(Debug)]
6pub enum BatteryError {
7 Success = 0,
8 NoBattery = 1,
9 NoCycleCount = 2,
10 ManagerError = 3,
11}
12
13#[repr(C)]
14pub struct BatteryResult {
15 pub cycle_count: u32,
16 pub error: BatteryError,
17}
18
19#[no_mangle]
20pub extern "C" fn battery_cycle_count() -> BatteryResult {
21 match battery::Manager::new() {
22 Ok(manager) => {
23 match manager.batteries() {
24 Ok(batteries) => {
25 // Get the first battery if available
26 if let Some(battery) = batteries.into_iter().next() {
27 match battery {
28 Ok(bat) => match bat.cycle_count() {
29 Some(count) => BatteryResult {
30 cycle_count: count,
31 error: BatteryError::Success,
32 },
33 None => {
34 error!("No cycle count available");
35 BatteryResult {
36 cycle_count: 0,
37 error: BatteryError::NoCycleCount,
38 }
39 }
40 },
41 Err(e) => {
42 error!("Battery error: {}", e);
43 BatteryResult {
44 cycle_count: 0,
45 error: BatteryError::NoBattery,
46 }
47 }
48 }
49 } else {
50 error!("No batteries found");
51 BatteryResult {
52 cycle_count: 0,
53 error: BatteryError::NoBattery,
54 }
55 }
56 }
57 Err(e) => {
58 error!("Failed to get batteries: {}", e);
59 BatteryResult {
60 cycle_count: 0,
61 error: BatteryError::ManagerError,
62 }
63 }
64 }
65 }
66 Err(e) => {
67 error!("Failed to create battery manager: {}", e);
68 BatteryResult {
69 cycle_count: 0,
70 error: BatteryError::ManagerError,
71 }
72 }
73 }
74}
75
76#[cfg(test)]
77mod test {
78 use super::*;
79
80 #[test]
81 fn test_battery_cycle_count() {
82 let result = battery_cycle_count();
83
84 match result.error {
85 BatteryError::Success => {
86 println!("Battery cycle count: {}", result.cycle_count);
87 assert!(result.cycle_count >= 1);
88 }
89 BatteryError::NoBattery => {
90 println!("No battery found");
91 assert_eq!(result.cycle_count, 0);
92 }
93 BatteryError::NoCycleCount => {
94 println!("No cycle count available");
95 assert_eq!(result.cycle_count, 0);
96 }
97 BatteryError::ManagerError => {
98 println!("Battery manager error");
99 assert_eq!(result.cycle_count, 0);
100 }
101 }
102
103 assert!(matches!(
104 result.error,
105 BatteryError::Success
106 | BatteryError::NoBattery
107 | BatteryError::NoCycleCount
108 | BatteryError::ManagerError
109 ));
110 }
111}