provenant/output_schema/
package_type.rs1use serde::{Deserialize, Serialize};
5use std::fmt;
6use std::str::FromStr;
7
8#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, Hash)]
9#[serde(transparent)]
10pub struct OutputPackageType(String);
11
12impl OutputPackageType {
13 pub fn as_str(&self) -> &str {
14 &self.0
15 }
16}
17
18impl fmt::Display for OutputPackageType {
19 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
20 f.write_str(&self.0)
21 }
22}
23
24impl From<crate::models::PackageType> for OutputPackageType {
25 fn from(value: crate::models::PackageType) -> Self {
26 Self(value.as_str().to_owned())
27 }
28}
29
30impl From<&crate::models::PackageType> for OutputPackageType {
31 fn from(value: &crate::models::PackageType) -> Self {
32 Self(value.as_str().to_owned())
33 }
34}
35
36impl TryFrom<&OutputPackageType> for crate::models::PackageType {
37 type Error = String;
38 fn try_from(value: &OutputPackageType) -> Result<Self, Self::Error> {
39 Self::from_str(value.as_str())
40 }
41}
42
43impl AsRef<str> for OutputPackageType {
44 fn as_ref(&self) -> &str {
45 &self.0
46 }
47}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52
53 #[test]
54 fn roundtrip_via_model() {
55 let model = crate::models::PackageType::Cargo;
56 let output = OutputPackageType::from(model);
57 assert_eq!(output.as_str(), "cargo");
58 let back = crate::models::PackageType::try_from(&output).unwrap();
59 assert_eq!(back, model);
60 }
61
62 #[test]
63 fn serializes_as_plain_string() {
64 let output = OutputPackageType::from(crate::models::PackageType::Cargo);
65 let json = serde_json::to_string(&output).unwrap();
66 assert_eq!(json, "\"cargo\"");
67 }
68
69 #[test]
70 fn deserializes_from_plain_string() {
71 let output: OutputPackageType = serde_json::from_str("\"cargo\"").unwrap();
72 assert_eq!(output.as_str(), "cargo");
73 }
74
75 #[test]
76 fn kebab_case_variant_roundtrips() {
77 let model = crate::models::PackageType::JbossService;
78 let output = OutputPackageType::from(model);
79 assert_eq!(output.as_str(), "jboss-service");
80 let back = crate::models::PackageType::try_from(&output).unwrap();
81 assert_eq!(back, model);
82 }
83}