node_js_release_info/
ext.rs1use crate::error::NodeJSRelInfoError;
2#[cfg(feature = "json")]
3use serde::{Deserialize, Serialize};
4use std::fmt::{Display, Formatter};
5use std::str::FromStr;
6
7#[derive(Clone, Debug, PartialEq)]
8#[cfg_attr(feature = "json", derive(Deserialize, Serialize))]
9pub enum NodeJSPkgExt {
10 #[cfg_attr(feature = "json", serde(rename = "tar.gz"))]
11 Targz,
12 #[cfg_attr(feature = "json", serde(rename = "tar.xz"))]
13 Tarxz,
14 #[cfg_attr(feature = "json", serde(rename = "zip"))]
15 Zip,
16 #[cfg_attr(feature = "json", serde(rename = "msi"))]
17 Msi,
18 #[cfg_attr(feature = "json", serde(rename = "7z"))]
19 S7z, }
21
22impl Default for NodeJSPkgExt {
23 fn default() -> Self {
24 NodeJSPkgExt::new()
25 }
26}
27
28impl NodeJSPkgExt {
29 pub fn new() -> NodeJSPkgExt {
30 NodeJSPkgExt::Targz
31 }
32}
33impl Display for NodeJSPkgExt {
34 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
35 let arch = match self {
36 NodeJSPkgExt::Targz => "tar.gz",
37 NodeJSPkgExt::Tarxz => "tar.xz",
38 NodeJSPkgExt::Zip => "zip",
39 NodeJSPkgExt::Msi => "msi",
40 NodeJSPkgExt::S7z => "7z",
41 };
42
43 write!(f, "{}", arch)
44 }
45}
46
47impl FromStr for NodeJSPkgExt {
48 type Err = NodeJSRelInfoError;
49
50 fn from_str(s: &str) -> Result<NodeJSPkgExt, NodeJSRelInfoError> {
51 match s {
52 "tar.gz" => Ok(NodeJSPkgExt::Targz),
53 "tar.xz" => Ok(NodeJSPkgExt::Tarxz),
54 "zip" => Ok(NodeJSPkgExt::Zip),
55 "msi" => Ok(NodeJSPkgExt::Msi),
56 "7z" => Ok(NodeJSPkgExt::S7z),
57 _ => Err(NodeJSRelInfoError::UnrecognizedExt(s.to_string())),
58 }
59 }
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65
66 #[test]
67 fn it_initializes() {
68 let ext = NodeJSPkgExt::new();
69 assert_eq!(ext, NodeJSPkgExt::Targz);
70 }
71
72 #[test]
73 fn it_initializes_with_defaults() {
74 let ext = NodeJSPkgExt::default();
75 assert_eq!(ext, NodeJSPkgExt::Targz);
76 }
77
78 #[test]
79 fn it_initializes_from_str() {
80 let ext = NodeJSPkgExt::from_str("tar.gz").unwrap();
81
82 assert_eq!(ext, NodeJSPkgExt::Targz);
83
84 let ext = NodeJSPkgExt::from_str("tar.xz").unwrap();
85
86 assert_eq!(ext, NodeJSPkgExt::Tarxz);
87
88 let ext = NodeJSPkgExt::from_str("zip").unwrap();
89
90 assert_eq!(ext, NodeJSPkgExt::Zip);
91
92 let ext = NodeJSPkgExt::from_str("msi").unwrap();
93
94 assert_eq!(ext, NodeJSPkgExt::Msi);
95
96 let ext = NodeJSPkgExt::from_str("7z").unwrap();
97
98 assert_eq!(ext, NodeJSPkgExt::S7z);
99 }
100
101 #[test]
102 fn it_serializes_to_str() {
103 let text = format!("{}", NodeJSPkgExt::Targz);
104
105 assert_eq!(text, "tar.gz");
106
107 let text = format!("{}", NodeJSPkgExt::Tarxz);
108
109 assert_eq!(text, "tar.xz");
110
111 let text = format!("{}", NodeJSPkgExt::Zip);
112
113 assert_eq!(text, "zip");
114
115 let text = format!("{}", NodeJSPkgExt::Msi);
116
117 assert_eq!(text, "msi");
118
119 let text = format!("{}", NodeJSPkgExt::S7z);
120
121 assert_eq!(text, "7z");
122 }
123
124 #[test]
125 #[should_panic(
126 expected = "called `Result::unwrap()` on an `Err` value: UnrecognizedExt(\"NOPE!\")"
127 )]
128 fn it_fails_when_arch_is_unrecognized() {
129 NodeJSPkgExt::from_str("NOPE!").unwrap();
130 }
131
132 #[test]
133 fn it_serializes_and_deserializes() {
134 let ext_json = serde_json::to_string(&NodeJSPkgExt::Tarxz).unwrap();
135 let ext: NodeJSPkgExt = serde_json::from_str(&ext_json).unwrap();
136 assert_eq!(ext, NodeJSPkgExt::Tarxz);
137 }
138}