cube-query-lib 0.1.1

A tool for querying the CubeMX database
Documentation
use serde::Deserialize;

#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
#[serde(rename = "IP")]
pub struct Ip {
    #[serde(rename = "DBVersion")]
    pub db_version: String,
    #[serde(rename = "IPType")]
    pub ip_type: String,
    pub name: String,
    pub version: String,
    pub about: String,
    #[serde(rename = "RefParameter", default)]
    pub ref_parameters: Vec<RefParameter>,

    #[serde(rename = "GPIO_Pin", default)]
    pub gpio_pins: Vec<GpioPin>,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct GpioPin {
    pub port_name: String,
    pub name: String,
    #[serde(rename = "SpecificParameter", default)]
    pub specific_parameters: Vec<SpecificParameter>,
    #[serde(rename = "PinSignal", default)]
    pub pin_signals: Vec<PinSignal>,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct SpecificParameter {
    pub name: String,
    #[serde(rename = "PossibleValue", default)]
    pub possible_values: Vec<String>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct PinSignal {
    pub name: String,
    #[serde(rename = "SpecificParameter", default)]
    pub specific_parameters: Vec<SpecificParameter>,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct RefParameter {
    pub name: String,
    pub comment: String,
    #[serde(rename = "Type")]
    pub r#type: String,
    pub default_value: Option<String>,
    pub visible: Option<String>,
    #[serde(rename = "PossibleValue", default)]
    pub possible_values: Vec<PossibleValue>,
    #[serde(rename = "Condition", default)]
    pub conditions: Vec<Condition>,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct PossibleValue {
    pub value: String,
    pub comment: String,
}

#[derive(Debug, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct Condition {
    pub diagnostic: String,
    pub expression: String,
}

pub fn parse_ip() -> anyhow::Result<Ip> {
    let db = crate::paths::obtain_db_folder()?;
    let ip = db.join("IP");
    assert!(ip.exists());
    let gpio = ip.join("GPIO-STM32H747_gpio_v1_0_Modes.xml");
    assert!(gpio.exists());
    let gpio = std::fs::read_to_string(gpio)?;
    let ip: Ip = serde_xml_rs::from_str(&gpio)?;
    Ok(ip)
}

#[cfg(test)]
mod tests {
    use crate::parse_ip::Ip;

    #[test]
    fn test_parse() {
        let db = crate::paths::obtain_db_folder().unwrap();
        let ip = db.join("IP");
        assert!(ip.exists());
        let gpio = ip.join("GPIO-STM32H747_gpio_v1_0_Modes.xml");
        assert!(gpio.exists());
        let gpio = std::fs::read_to_string(gpio).unwrap();
        let ip: Ip = serde_xml_rs::from_str(&gpio).unwrap();

        println!("{:#?}", ip)
    }
}