agentzero_tools/
hardware.rs1use 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}