use std::collections::{HashMap, HashSet};
use std::fs::File;
use std::io::Read;
use crate::Block;
fn read_block_file(block_name: &str) -> Block {
let path = format!("registers/blocks/{block_name}.yaml");
let mut file =
File::open(&path).unwrap_or_else(|_| panic!("Failed to open block file: {}", path));
let mut content = String::new();
file.read_to_string(&mut content).unwrap();
let mut parsed_data: HashMap<String, Block> = serde_yaml::from_str(&content).unwrap();
parsed_data
.remove(&format!("block/USB"))
.unwrap_or_else(|| panic!("block/USB not found in {}", block_name))
}
pub fn load_and_merge_block(block_name: &str) -> Block {
let mut block = read_block_file(block_name);
if let Some(parent_name) = &block.inherits {
let parent_block = load_and_merge_block(parent_name);
let mut final_items = parent_block.items;
let parent_item_map: HashMap<_, _> = final_items
.iter()
.enumerate()
.map(|(i, item)| (item.name.clone(), i))
.collect();
for child_item in block.items {
if let Some(&index) = parent_item_map.get(&child_item.name) {
final_items[index] = child_item;
} else {
final_items.push(child_item);
}
}
block.items = final_items;
if block.description.is_none() {
block.description = parent_block.description;
}
}
block.inherits = None;
block
}
pub fn extract_fieldsets_from_block(merged_block: &Block) -> Vec<String> {
merged_block
.items
.iter()
.map(|item| item.fieldset.clone())
.collect::<HashSet<_>>() .into_iter()
.collect() }