Commit 0fc7b49
Changed files (3)
internal
get
internal/get/sensors.go
@@ -8,29 +8,22 @@ package get
import "C"
import (
"fmt"
+
"github.com/kahnwong/swissknife/configs/color"
"github.com/rs/zerolog/log"
- "github.com/shirou/gopsutil/v4/sensors"
)
func Sensors() {
- fmt.Println(float32(C.sensors()))
-
- //str1 := C.CString("world")
- //defer C.free(unsafe.Pointer(str1))
- //C.hello(str1)
+ result := C.sensors()
- s, err := sensors.SensorsTemperatures()
- if err != nil {
- log.Fatal().Msg("Failed to get sensors info")
+ switch result.error {
+ case C.SENSOR_SUCCESS:
+ fmt.Printf("%s: %.2f\n", color.Green("Temperature"), float64(result.temperature))
+ case C.SENSOR_NO_COMPONENTS:
+ log.Fatal().Msg("No components found")
+ case C.SENSOR_NO_TEMPERATURE:
+ log.Fatal().Msg("No temperature reading available")
+ default:
+ log.Fatal().Msg("Unknown error occurred")
}
-
- var temperature float64
- for _, sensor := range s {
- if temperature < sensor.Temperature {
- temperature = sensor.Temperature
- }
- }
-
- fmt.Printf("%s: %.2f\n", color.Green("Temperature"), temperature)
}
lib/system/src/lib.rs
@@ -4,32 +4,75 @@ extern crate sysinfo;
use log::error;
use sysinfo::{Components, System};
+#[repr(C)]
+#[derive(Debug)]
+pub enum SensorError {
+ Success = 0,
+ NoComponents = 1,
+ NoTemperature = 2,
+}
+
+#[repr(C)]
+pub struct SensorResult {
+ pub temperature: f32,
+ pub error: SensorError,
+}
#[no_mangle]
-pub extern "C" fn sensors() -> f32 {
+pub extern "C" fn sensors() -> SensorResult {
let mut system = System::new_all();
system.refresh_all();
let components = Components::new_with_refreshed_list();
- let mut output: f32 = 0.0;
if let Some(component) = (&components).into_iter().next() {
- if let Some(temperature) = component.temperature() {
- output = temperature;
+ if let Some(temp) = component.temperature() {
+ SensorResult {
+ temperature: temp,
+ error: SensorError::Success,
+ }
} else {
- error!("Unknown temperature: {}", component.label())
+ error!("Unknown temperature: {}", component.label());
+ SensorResult {
+ temperature: 0.0,
+ error: SensorError::NoTemperature,
+ }
+ }
+ } else {
+ error!("No components found");
+ SensorResult {
+ temperature: 0.0,
+ error: SensorError::NoComponents,
}
}
-
- output
}
-
#[cfg(test)]
pub mod test {
use super::*;
#[test]
fn simulated_main_function() {
- sensors();
+ let result = sensors();
+
+ match result.error {
+ SensorError::Success => {
+ println!("Temperature reading successful: {} °C", result.temperature);
+ assert!(result.temperature >= 0.0); // Basic sanity check
+ }
+ SensorError::NoComponents => {
+ println!("No components found");
+ assert_eq!(result.temperature, 0.0);
+ }
+ SensorError::NoTemperature => {
+ println!("No temperature reading available");
+ assert_eq!(result.temperature, 0.0);
+ }
+ }
+
+ // Ensure we got some kind of valid result
+ assert!(matches!(
+ result.error,
+ SensorError::Success | SensorError::NoComponents | SensorError::NoTemperature
+ ));
}
}
lib/system.h
@@ -1,1 +1,12 @@
-float sensors(void);
+enum SensorError {
+ SENSOR_SUCCESS = 0,
+ SENSOR_NO_COMPONENTS = 1,
+ SENSOR_NO_TEMPERATURE = 2
+};
+
+struct SensorResult {
+ float temperature;
+ enum SensorError error;
+};
+
+struct SensorResult sensors(void);