Skip to main content

agentzero_tools/
hardware.rs

1use anyhow::anyhow;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
5pub struct HardwareBoard {
6    pub id: String,
7    pub display_name: String,
8    pub architecture: String,
9    pub memory_kb: u32,
10}
11
12pub fn discover_boards() -> Vec<HardwareBoard> {
13    vec![
14        HardwareBoard {
15            id: "sim-stm32".to_string(),
16            display_name: "Simulated STM32 Board".to_string(),
17            architecture: "arm-cortex-m".to_string(),
18            memory_kb: 256,
19        },
20        HardwareBoard {
21            id: "sim-rpi".to_string(),
22            display_name: "Simulated Raspberry Pi".to_string(),
23            architecture: "arm64".to_string(),
24            memory_kb: 1024 * 1024,
25        },
26    ]
27}
28
29pub fn board_info(id: &str) -> anyhow::Result<HardwareBoard> {
30    discover_boards()
31        .into_iter()
32        .find(|b| b.id == id)
33        .ok_or_else(|| anyhow!("unknown hardware board id: {id}"))
34}
35
36#[cfg(test)]
37mod tests {
38    use super::{board_info, discover_boards};
39
40    #[test]
41    fn discover_boards_returns_known_targets_success_path() {
42        let boards = discover_boards();
43        assert!(!boards.is_empty());
44        assert!(boards.iter().any(|b| b.id == "sim-stm32"));
45    }
46
47    #[test]
48    fn board_info_rejects_unknown_id_negative_path() {
49        let err = board_info("missing-board").expect_err("unknown board should fail");
50        assert!(err.to_string().contains("unknown hardware board id"));
51    }
52}