use crate::board::BoardPanel;
use crate::library::Library;
use std::collections::HashSet;
pub(crate) fn library_references_valid(
library: &Library,
board: &BoardPanel,
) -> Result<(), String> {
let mut board_components = HashSet::new();
for component in board.component_placements.iter() {
if component.reference_designator == "BOARD" {
continue;
}
board_components.insert(component.package_name.clone());
}
let mut library_components = HashSet::new();
for component in library.electrical_components.iter() {
library_components.insert(component.geometry_name.clone());
}
for component in library.mechanical_components.iter() {
library_components.insert(component.geometry_name.clone());
}
for component in board_components.iter() {
if !library_components.contains(component) {
return Err(format!(
"Component {} referenced in board not found in library.",
component
));
}
}
Ok(())
}
pub(crate) fn panel_references_valid(
panel: &BoardPanel,
boards: &[BoardPanel],
) -> Result<(), String> {
let mut referenced_boards = HashSet::new();
for placement in panel.component_placements.iter() {
if placement.reference_designator == "BOARD" {
referenced_boards.insert(placement.package_name.clone());
}
}
for ref_board in referenced_boards.iter() {
if !boards
.iter()
.any(|board| board.header.board_name == *ref_board)
{
return Err(format!(
"Board {} referenced in panel not found.",
ref_board
));
}
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::component_placement::ComponentPlacement;
use crate::parse_board_file;
use crate::parse_library_file;
#[test]
fn test_library_references_valid() {
let library = parse_library_file("src/test_files/library.emp").unwrap();
let board = parse_board_file("src/test_files/board.emn").unwrap();
let result = library_references_valid(&library, &board);
result.unwrap();
let dummy_component = ComponentPlacement {
package_name: "dummy_component".to_string(),
part_number: "dummy_part".to_string(),
reference_designator: "DUMMY".to_string(),
x: 0.0,
y: 0.0,
mounting_offset: 0.0,
rotation_angle: 0.0,
board_side: "TOP".to_string(),
placement_status: "PLACED".to_string(),
};
let mut board = board.clone();
board.component_placements.push(dummy_component);
let result = library_references_valid(&library, &board);
assert!(result.is_err());
}
#[test]
fn test_panel_references_valid() {
let panel = parse_board_file("src/test_files/panel.emn").unwrap();
let boards = vec![parse_board_file("src/test_files/board.emn").unwrap()];
let result = panel_references_valid(&panel, &boards);
result.unwrap();
let dummy_component = ComponentPlacement {
package_name: "dummy_board".to_string(),
part_number: "dummy_part".to_string(),
reference_designator: "BOARD".to_string(),
x: 0.0,
y: 0.0,
mounting_offset: 0.0,
rotation_angle: 0.0,
board_side: "TOP".to_string(),
placement_status: "PLACED".to_string(),
};
let mut panel = panel.clone();
panel.component_placements.push(dummy_component);
let result = panel_references_valid(&panel, &boards);
assert!(result.is_err());
}
}