master
  1use battery;
  2use log::error;
  3
  4#[repr(C)]
  5#[derive(Debug)]
  6pub enum BatteryTimeToEmptyError {
  7    Success = 0,
  8    NoBattery = 1,
  9    NoTimeToEmpty = 2,
 10    ManagerError = 3,
 11}
 12
 13#[repr(C)]
 14pub struct BatteryTimeToEmptyResult {
 15    pub time_to_empty_seconds: u64,
 16    pub error: BatteryTimeToEmptyError,
 17}
 18
 19#[no_mangle]
 20pub extern "C" fn battery_time_to_empty() -> BatteryTimeToEmptyResult {
 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) => {
 29                                match bat.time_to_empty() {
 30                                    Some(time) => {
 31                                        // Convert Time to seconds as u64
 32                                        let seconds = time.get::<battery::units::time::second>();
 33                                        BatteryTimeToEmptyResult {
 34                                            time_to_empty_seconds: seconds as u64,
 35                                            error: BatteryTimeToEmptyError::Success,
 36                                        }
 37                                    }
 38                                    None => {
 39                                        error!("No time to empty available");
 40                                        BatteryTimeToEmptyResult {
 41                                            time_to_empty_seconds: 0,
 42                                            error: BatteryTimeToEmptyError::NoTimeToEmpty,
 43                                        }
 44                                    }
 45                                }
 46                            }
 47                            Err(e) => {
 48                                error!("Battery error: {}", e);
 49                                BatteryTimeToEmptyResult {
 50                                    time_to_empty_seconds: 0,
 51                                    error: BatteryTimeToEmptyError::NoBattery,
 52                                }
 53                            }
 54                        }
 55                    } else {
 56                        error!("No batteries found");
 57                        BatteryTimeToEmptyResult {
 58                            time_to_empty_seconds: 0,
 59                            error: BatteryTimeToEmptyError::NoBattery,
 60                        }
 61                    }
 62                }
 63                Err(e) => {
 64                    error!("Failed to get batteries: {}", e);
 65                    BatteryTimeToEmptyResult {
 66                        time_to_empty_seconds: 0,
 67                        error: BatteryTimeToEmptyError::ManagerError,
 68                    }
 69                }
 70            }
 71        }
 72        Err(e) => {
 73            error!("Failed to create battery manager: {}", e);
 74            BatteryTimeToEmptyResult {
 75                time_to_empty_seconds: 0,
 76                error: BatteryTimeToEmptyError::ManagerError,
 77            }
 78        }
 79    }
 80}
 81
 82#[cfg(test)]
 83mod test {
 84    use super::*;
 85
 86    #[test]
 87    fn test_battery_time_to_empty() {
 88        let result = battery_time_to_empty();
 89
 90        match result.error {
 91            BatteryTimeToEmptyError::Success => {
 92                println!(
 93                    "Battery time to empty: {} seconds",
 94                    result.time_to_empty_seconds
 95                );
 96                assert!(result.time_to_empty_seconds > 0);
 97            }
 98            BatteryTimeToEmptyError::NoBattery => {
 99                println!("No battery found");
100                assert_eq!(result.time_to_empty_seconds, 0);
101            }
102            BatteryTimeToEmptyError::NoTimeToEmpty => {
103                println!("No time to empty available");
104                assert_eq!(result.time_to_empty_seconds, 0);
105            }
106            BatteryTimeToEmptyError::ManagerError => {
107                println!("Battery manager error");
108                assert_eq!(result.time_to_empty_seconds, 0);
109            }
110        }
111
112        assert!(matches!(
113            result.error,
114            BatteryTimeToEmptyError::Success
115                | BatteryTimeToEmptyError::NoBattery
116                | BatteryTimeToEmptyError::NoTimeToEmpty
117                | BatteryTimeToEmptyError::ManagerError
118        ));
119    }
120}