1use std::io::Read;
2use std::rc::Rc;
3
4use cwe_xml::cwe::{CweDatabase, WeaknessVisitor};
5use cwe_xml::cwe::weaknesses::Weakness;
6
7fn main() -> Result<(), Box<dyn std::error::Error>> {
10 let mut cwe_db = CweDatabase::new();
11
12 cwe_db.import_weakness_catalog_from_url("https://cwe.mitre.org/data/xml/views/699.xml.zip")?;
14 cwe_db.import_weakness_catalog_from_url("https://cwe.mitre.org/data/xml/views/1000.xml.zip")?;
15 cwe_db.import_weakness_catalog_from_url("https://cwe.mitre.org/data/xml/views/1194.xml.zip")?;
16
17 cwe_db.infer_categories_from_ancestors();
18 cwe_db.infer_categories_from_descendants();
19
20 let cwe_id: i64 = 306;
22 let weakness = cwe_db.weakness_by_cwe_id(cwe_id);
23 println!("Weakness CWE-ID-{}\n{:#?}", cwe_id, weakness);
24
25 let categories = cwe_db.categories_by_cwe_id(cwe_id);
27 println!("Categories {:#?}", categories);
28
29 let children = cwe_db.weakness_children_by_cwe_id(1076);
30 println!("CWE-{} has {} children", cwe_id, children.len());
31
32 println!("{} CWE roots", cwe_db.weakness_roots().len());
33 for root in &cwe_db.weakness_roots() {
34 println!("CWE-{} is a root '{}'", root.id, root.name);
35 }
36
37 let mut visitor = Visitor;
38
39 cwe_db.visit_weaknesses(&mut visitor);
40
41 println!("{}", cwe_db);
43
44 Ok(())
45}
46
47struct Visitor;
48
49impl WeaknessVisitor for Visitor {
50 fn visit(&mut self, db: &CweDatabase, level: usize, weakness: Rc<Weakness>) {
51 let cats = db.categories_by_cwe_id(weakness.id).iter().map(|c| c.name.clone()).collect::<Vec<_>>();
52
53 println!("{} CWE-{} {} (subtree-size: {}, categories: {:?})",
54 " ".repeat(level * 2),
55 weakness.id,
56 weakness.name,
57 db.weakness_subtree_by_cwe_id(weakness.id).len(),
58 cats
59 );
60 }
61}