use serde::{Deserialize, Serialize};
pub mod apis;
pub mod boards;
pub mod components;
pub mod conditions;
pub mod csolution;
pub mod debug_access;
pub mod examples;
pub mod family;
pub mod generators;
pub mod part_taxonomy;
pub mod parts;
pub mod pdsc;
pub mod requirements;
pub mod taxonomy;
#[derive(Debug, PartialEq, Eq, Clone, Deserialize, Serialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct Package<'a> {
pub name: String,
pub vendor: String,
pub schema_version: String,
#[serde(rename = "Dcore")]
pub d_core: Option<String>,
#[serde(rename = "Dvendor")]
pub d_vendor: Option<String>,
#[serde(rename = "Dname")]
pub d_name: Option<String>,
#[serde(rename = "Tcompiler")]
pub t_compiler: Option<String>,
pub description: pdsc::Description,
pub eccn: Option<pdsc::Eccn>,
pub url: String,
pub support_contact: Option<String>,
pub license: Option<String>,
pub license_sets: Option<pdsc::LicenseSets>,
pub dominate: Option<pdsc::Dominate>,
pub requirements: Option<requirements::Requirements>,
pub repository: Option<pdsc::Repository>,
pub releases: pdsc::Releases,
pub changelogs: Option<pdsc::Changelogs>,
pub keywords: Option<pdsc::Keywords>,
pub environments: Option<pdsc::Environments>,
pub generators: Option<generators::Generators>,
pub boards: Option<boards::Boards>,
pub parts: Option<parts::Parts>,
pub taxonomy: Option<taxonomy::Taxonomy>,
#[serde(rename = "part-taxonomy")]
pub part_taxonomy: Option<part_taxonomy::PartTaxonomy>,
pub apis: Option<apis::Apis>,
#[serde(borrow)]
pub devices: Option<pdsc::Devices<'a>>,
pub conditions: Option<conditions::Conditions>,
pub examples: Option<examples::Examples>,
pub csolution: Option<csolution::Csolution>,
pub components: Option<components::Components>,
}
impl<'a> Package<'a> {
pub fn new(document: &'a roxmltree::Document) -> Result<Self, Error> {
let mut package: Package = serde_roxmltree::from_doc(document)?;
for family in package
.devices
.iter_mut()
.flat_map(|devices| devices.families.iter_mut())
{
family.debugvars = family::merge_debugvars(&family.debugvars_raw)?;
family.debugvars.parse_debugvars();
family.sequences = family::merge_sequences(&family.sequences_raw)?;
family.sequences.parse_sequences()?;
family.flashinfo = family::parse_flashinfo(&family.flashinfo_raw)?;
for sf in &mut family.sub_families {
sf.debugvars = family::merge_debugvars(&sf.debugvars_raw)?;
sf.debugvars.parse_debugvars();
sf.sequences = family::merge_sequences(&sf.sequences_raw)?;
sf.sequences.parse_sequences()?;
sf.flashinfo = family::parse_flashinfo(&sf.flashinfo_raw)?;
for device in &mut sf.devices {
device.debugvars = family::merge_debugvars(&device.debugvars_raw)?;
device.debugvars.parse_debugvars();
device.sequences = family::merge_sequences(&device.sequences_raw)?;
device.sequences.parse_sequences()?;
device.flashinfo = family::parse_flashinfo(&device.flashinfo_raw)?;
for variant in &mut device.variants {
variant.debugvars = family::merge_debugvars(&variant.debugvars_raw)?;
variant.debugvars.parse_debugvars();
variant.sequences = family::merge_sequences(&variant.sequences_raw)?;
variant.sequences.parse_sequences()?;
variant.flashinfo = family::parse_flashinfo(&variant.flashinfo_raw)?;
}
}
}
for device in &mut family.devices {
device.debugvars = family::merge_debugvars(&device.debugvars_raw)?;
device.debugvars.parse_debugvars();
device.sequences = family::merge_sequences(&device.sequences_raw)?;
device.sequences.parse_sequences()?;
device.flashinfo = family::parse_flashinfo(&device.flashinfo_raw)?;
for variant in &mut device.variants {
variant.debugvars = family::merge_debugvars(&variant.debugvars_raw)?;
variant.debugvars.parse_debugvars();
variant.sequences = family::merge_sequences(&variant.sequences_raw)?;
variant.sequences.parse_sequences()?;
variant.flashinfo = family::parse_flashinfo(&variant.flashinfo_raw)?;
}
}
}
Ok(package)
}
}
#[derive(Debug, PartialEq, Eq)]
pub enum Error {
SerdeRoxmltree(serde_roxmltree::Error),
Family(family::FamilyParseError),
Debug(debug_access::DebugAccessParseError),
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Unable to parse document, got error: {self:?}")
}
}
impl std::error::Error for Error {}
impl From<serde_roxmltree::Error> for Error {
fn from(value: serde_roxmltree::Error) -> Self {
Self::SerdeRoxmltree(value)
}
}