use serde::{Deserialize, Serialize};
use super::yaml_parser::ElementYAML;
#[derive(Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ElementYamlTable {
#[serde(rename = "Element_info")]
pub elements: Vec<ElementYAML>,
}
impl ElementYamlTable {
pub fn new_array_type(&self, type_annotation: &str) -> String {
format!(
"[{type_annotation}; {length}]",
length = self.elements.len()
)
}
pub fn new_array_content(&self, format_closure: fn(&ElementYAML) -> String) -> String {
let contents_vec: Vec<String> = self.elements.iter().map(format_closure).collect();
contents_vec.join(", ")
}
pub fn new_const_array(var_name: &str, var_type: &str, array_content: &str) -> String {
format!("pub const {var_name}: {var_type} = [{array_content}];")
}
pub fn export_struct(&self) -> String {
let init_element = |elm: &ElementYAML| -> String {
format!("Element{{ symbol: ElementSymbol::{:?}, atomic_number: {}_u8, lcao: {}_u8, mass: {:?}, potential: \"{}\", spin:{}_u8, covalent_radius: {}\n}}", &elm.symbol, elm.atomic_number, elm.lcao, elm.mass, &elm.potential, elm.spin, if let Some(r) = elm.covalent_radius {format!("Some({})", r)} else {"None".into()})
};
let var_name = "ELEMENT_TABLE";
let var_type = self.new_array_type("Element");
let array_content = self.new_array_content(init_element);
Self::new_const_array(var_name, &var_type, &array_content)
}
}