cyclonedx_rust/component/
classification.rs

1use heck::KebabCase;
2use serde::{Deserialize, Serialize};
3use std::fmt;
4use std::fmt::{Display, Formatter};
5use std::io::Write;
6use strum_macros::EnumString;
7use xml::attribute::OwnedAttribute;
8use xml::namespace::Namespace;
9use xml::writer::XmlEvent;
10use yaserde::ser::Serializer;
11use yaserde::YaSerialize;
12use yaserde_derive::YaDeserialize;
13
14#[derive(Clone, PartialEq, Debug, Serialize, Deserialize, YaDeserialize, EnumString)]
15#[serde(rename_all = "kebab-case")]
16pub enum Classification {
17    #[yaserde(rename = "required")]
18    Application,
19    #[yaserde(rename = "framework")]
20    Framework,
21    #[yaserde(rename = "library")]
22    Library,
23    #[yaserde(rename = "container")]
24    Container,
25    #[yaserde(rename = "operating-system")]
26    OperatingSystem,
27    #[yaserde(rename = "device")]
28    Device,
29    #[yaserde(rename = "firmware")]
30    Firmware,
31    #[yaserde(rename = "file")]
32    File,
33}
34
35impl Default for Classification {
36    fn default() -> Self {
37        Classification::Application
38    }
39}
40
41impl Display for Classification {
42    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
43        write!(f, "{:?}", self)
44    }
45}
46impl YaSerialize for Classification {
47    fn serialize<W: Write>(&self, writer: &mut Serializer<W>) -> Result<(), String> {
48        let data = self.to_string();
49        let _r = writer.write(XmlEvent::characters(&data.to_kebab_case()));
50        Ok(())
51    }
52
53    fn serialize_attributes(
54        &self,
55        attributes: Vec<OwnedAttribute>,
56        namespace: Namespace,
57    ) -> Result<(Vec<OwnedAttribute>, Namespace), String> {
58        Ok((attributes, namespace))
59    }
60}
61
62#[cfg(test)]
63mod tests {
64    use super::*;
65
66    use yaserde::ser::Config;
67
68    #[test]
69    fn print_xml() {
70        assert_eq!(
71            "application",
72            serialize_classification_as_xml(Classification::Application)
73        );
74        assert_eq!(
75            "operating-system",
76            serialize_classification_as_xml(Classification::OperatingSystem)
77        );
78        assert_eq!(
79            "library",
80            serialize_classification_as_xml(Classification::Library)
81        );
82        assert_eq!(
83            "framework",
84            serialize_classification_as_xml(Classification::Framework)
85        );
86        assert_eq!(
87            "firmware",
88            serialize_classification_as_xml(Classification::Firmware)
89        );
90        assert_eq!(
91            "device",
92            serialize_classification_as_xml(Classification::Device)
93        );
94        assert_eq!(
95            "container",
96            serialize_classification_as_xml(Classification::Container)
97        );
98        assert_eq!(
99            "file",
100            serialize_classification_as_xml(Classification::File)
101        );
102    }
103
104    fn serialize_classification_as_xml(classification: Classification) -> String {
105        let actual = yaserde::ser::to_string_with_config(
106            &classification,
107            &Config {
108                perform_indent: false,
109                write_document_declaration: false,
110                indent_string: None,
111            },
112        )
113        .unwrap();
114        actual
115    }
116}