cyclonedx_rust/component/
classification.rs1use 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}