use serde::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
pub struct Requirements {
pub packages: Option<PackagesList>,
pub compilers: Option<CompilersList>,
pub languages: Option<LanguagesList>,
pub targets: Option<TargetsList>,
}
#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
pub struct PackagesList {
#[serde(rename = "package")]
pub packages: Vec<Package>,
}
#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
pub struct CompilersList {
#[serde(rename = "compiler")]
pub compilers: Vec<Compiler>,
}
#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
pub struct LanguagesList {
#[serde(rename = "language")]
pub languages: Vec<Language>,
}
#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
pub struct TargetsList {
#[serde(rename = "target")]
pub targets: Vec<Target>,
}
#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
pub struct Package {
pub vendor: String,
pub name: String,
pub version: Option<String>,
}
#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
pub struct Compiler {
pub name: String,
pub version: String,
}
#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
pub struct Language {
pub name: String,
pub version: String,
}
#[derive(Debug, PartialEq, Eq, Clone, Default, Deserialize, Serialize)]
pub struct Target {
#[serde(rename = "Dvendor")]
pub device_vendor: Option<String>,
#[serde(rename = "Dname")]
pub device_name: Option<String>,
#[serde(rename = "Dcore")]
pub device_core: Option<String>,
#[serde(rename = "Bvendor")]
pub board_vendor: Option<String>,
#[serde(rename = "Bname")]
pub board_name: Option<String>,
#[serde(rename = "Brevision")]
pub board_revision: Option<String>,
#[serde(rename = "#content")]
pub content: String,
}
#[cfg(test)]
mod tests {
use crate::requirements::{
Compiler, CompilersList, Language, LanguagesList, Package, PackagesList, Requirements,
Target, TargetsList,
};
#[test]
fn isolate_fields() {
let xml_packages = r#"<?xml version="1.0"?><requirements><packages><package name="A" vendor="B"/></packages></requirements>"#;
let xml_compilers = r#"<?xml version="1.0"?><requirements><compilers><compiler name="ARMCC" version="5.0"/></compilers></requirements>"#;
let xml_languages = r#"<?xml version="1.0"?><requirements><languages><language name="C" version="99"/></languages></requirements>"#;
let xml_targets = r#"<?xml version="1.0"?><requirements><targets><target Dvendor="X:1" Dname="Y"/></targets></requirements>"#;
let r: Result<Requirements, _> = serde_roxmltree::from_str(xml_packages);
println!("packages: {:?}", r.err());
let r: Result<Requirements, _> = serde_roxmltree::from_str(xml_compilers);
println!("compilers: {:?}", r.err());
let r: Result<Requirements, _> = serde_roxmltree::from_str(xml_languages);
println!("languages: {:?}", r.err());
let r: Result<Requirements, _> = serde_roxmltree::from_str(xml_targets);
println!("targets: {:?}", r.err());
}
#[test]
fn parse_requirements() {
let xml_str = r#"<?xml version="1.0" encoding="UTF-8"?>
<requirements>
<packages>
<package name="STM32F4xx_DFP" vendor="Keil" version="2.8.0:2.8.0"/>
</packages>
<compilers>
<compiler name="ARMCC" version="5.0.0:6.0.0-0"/>
</compilers>
<languages>
<language name="C" version="99"/>
</languages>
<targets>
<target Dvendor="STMicroelectronics:13" Dname="STM32H7*"/> <!-- supports STM32H7 device series -->
<target Dvendor="STMicroelectronics:13" Dname="STM32U585"/> <!-- and supports STM32U585 device -->
</targets>
</requirements>"#;
let requirements: Requirements = serde_roxmltree::from_str(xml_str).unwrap();
assert_eq!(
requirements.packages,
Some(PackagesList {
packages: vec![Package {
name: "STM32F4xx_DFP".to_string(),
vendor: "Keil".to_string(),
version: Some("2.8.0:2.8.0".to_string())
}]
})
);
assert_eq!(
requirements.compilers,
Some(CompilersList {
compilers: vec![Compiler {
name: "ARMCC".to_string(),
version: "5.0.0:6.0.0-0".to_string()
}]
})
);
assert_eq!(
requirements.languages,
Some(LanguagesList {
languages: vec![Language {
name: "C".to_string(),
version: "99".to_string()
}]
})
);
assert_eq!(
requirements.targets,
Some(TargetsList {
targets: vec![
Target {
device_vendor: Some("STMicroelectronics:13".to_string()),
device_name: Some("STM32H7*".to_string()),
device_core: None,
board_name: None,
board_revision: None,
board_vendor: None,
content: String::new()
},
Target {
device_vendor: Some("STMicroelectronics:13".to_string()),
device_name: Some("STM32U585".to_string()),
device_core: None,
board_name: None,
board_revision: None,
board_vendor: None,
content: String::new()
}
]
})
);
}
}