node_js_release_info/
ext.rs

1use 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, // can't start w/ a number (X_x)
20}
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}