master
 1use log::error;
 2use sysinfo::{Components, System};
 3
 4#[repr(C)]
 5#[derive(Debug)]
 6pub enum SensorError {
 7    Success = 0,
 8    NoComponents = 1,
 9    NoTemperature = 2,
10}
11
12#[repr(C)]
13pub struct SensorResult {
14    pub temperature: f32,
15    pub error: SensorError,
16}
17
18#[no_mangle]
19pub extern "C" fn sensors() -> SensorResult {
20    let mut system = System::new_all();
21    system.refresh_all();
22    let components = Components::new_with_refreshed_list();
23
24    if let Some(component) = (&components).into_iter().next() {
25        if let Some(temp) = component.temperature() {
26            SensorResult {
27                temperature: temp,
28                error: SensorError::Success,
29            }
30        } else {
31            error!("Unknown temperature: {}", component.label());
32            SensorResult {
33                temperature: 0.0,
34                error: SensorError::NoTemperature,
35            }
36        }
37    } else {
38        error!("No components found");
39        SensorResult {
40            temperature: 0.0,
41            error: SensorError::NoComponents,
42        }
43    }
44}
45
46#[cfg(test)]
47pub mod test {
48    use super::*;
49
50    #[test]
51    fn simulated_main_function() {
52        let result = sensors();
53
54        match result.error {
55            SensorError::Success => {
56                println!("Temperature reading successful: {} °C", result.temperature);
57                assert!(result.temperature >= 0.0); // Basic sanity check
58            }
59            SensorError::NoComponents => {
60                println!("No components found");
61                assert_eq!(result.temperature, 0.0);
62            }
63            SensorError::NoTemperature => {
64                println!("No temperature reading available");
65                assert_eq!(result.temperature, 0.0);
66            }
67        }
68
69        // Ensure we got some kind of valid result
70        assert!(matches!(
71            result.error,
72            SensorError::Success | SensorError::NoComponents | SensorError::NoTemperature
73        ));
74    }
75}