hermes_five/utils/
mod.rs

1//! Various utilities and helper functions.
2
3pub use log;
4#[cfg(test)]
5pub use serial_test;
6use std::fmt::Write;
7pub use tokio;
8
9mod events;
10mod range;
11mod scale;
12mod state;
13pub mod task;
14
15pub use crate::utils::events::*;
16pub use crate::utils::range::*;
17pub use crate::utils::scale::*;
18pub use crate::utils::state::*;
19pub use crate::utils::task::*;
20
21/// Helper to format a buffer as hex.
22#[allow(dead_code)]
23pub(crate) fn format_as_hex<T: std::fmt::UpperHex>(slice: &[T]) -> String {
24    let mut result = String::with_capacity(slice.len() * 5); // Preallocate memory
25
26    for (i, byte) in slice.iter().enumerate() {
27        if i > 0 {
28            result.push_str(", ");
29        }
30        // Use `write!` directly to append formatted byte to result
31        let _ = write!(result, "0x{:02X}", byte);
32    }
33
34    result
35}
36
37#[cfg(test)]
38mod tests {
39    use super::format_as_hex;
40
41    #[test]
42    fn test_format_as_hex_empty_slice() {
43        let input: [u8; 0] = [];
44        let result = format_as_hex(&input);
45        assert_eq!(result, "");
46    }
47
48    #[test]
49    fn test_format_as_hex_single_element() {
50        let input = [15u8];
51        let result = format_as_hex(&input);
52        assert_eq!(result, "0x0F");
53    }
54
55    #[test]
56    fn test_format_as_hex_multiple_elements() {
57        let input = [15u8, 255, 0, 128];
58        let result = format_as_hex(&input);
59        assert_eq!(result, "0x0F, 0xFF, 0x00, 0x80");
60    }
61
62    #[test]
63    fn test_format_as_hex_u16() {
64        let input = [4095u16, 65535];
65        let result = format_as_hex(&input);
66        assert_eq!(result, "0xFFF, 0xFFFF");
67    }
68
69    #[test]
70    fn test_format_as_hex_large_numbers() {
71        let input = [123456789u32, 4294967295];
72        let result = format_as_hex(&input);
73        assert_eq!(result, "0x75BCD15, 0xFFFFFFFF");
74    }
75}
76
77#[cfg(feature = "serde")]
78// Helper for serialize skip method.
79pub(crate) fn is_default<T: Default + PartialEq>(t: &T) -> bool {
80    t == &T::default()
81}
82
83#[cfg(feature = "serde")]
84#[cfg(test)]
85mod serde_tests {
86    use crate::utils::is_default;
87
88    #[test]
89    fn test_is_default() {
90        // Bool
91        assert_eq!(is_default(&true), false);
92        assert_eq!(is_default(&false), true);
93        // String
94        assert_eq!(is_default(&String::new()), true);
95        assert_eq!(is_default(&String::from("test")), false);
96        // usize
97        assert_eq!(is_default(&0), true);
98        assert_eq!(is_default(&69), false);
99
100        // ....
101    }
102}