1use std::str::FromStr;
2
3#[derive(Debug, Default, PartialEq, Clone, Copy)]
5pub enum Channel {
6 #[default]
7 Stable,
8 Beta,
9 Dev,
10}
11
12impl Channel {
13 pub fn to_str(&self) -> &'static str {
15 match self {
16 Channel::Stable => "stable",
17 Channel::Beta => "beta",
18 Channel::Dev => "dev",
19 }
20 }
21}
22
23impl std::fmt::Display for Channel {
24 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25 write!(f, "{}", self.to_str())
26 }
27}
28
29impl std::str::FromStr for Channel {
30 type Err = ();
31
32 fn from_str(s: &str) -> Result<Self, Self::Err> {
33 let s = s.to_lowercase();
34 if s.ends_with("beta") {
35 Ok(Channel::Beta)
36 } else if s.ends_with("dev") {
37 Ok(Channel::Dev)
38 } else {
39 Ok(Channel::Stable)
40 }
41 }
42}
43
44impl std::convert::From<&str> for Channel {
45 fn from(value: &str) -> Self {
46 Channel::from_str(value).unwrap()
47 }
48}
49
50#[cfg(test)]
51mod test {
52 use std::str::FromStr;
53
54 use super::Channel;
55
56 #[test]
57 fn channel_test() {
58 assert_eq!(Channel::from_str("3.0.1"), Ok(Channel::Stable));
59 assert_eq!(Channel::from_str("3.0.1-5.6.dev"), Ok(Channel::Dev));
60 assert_eq!(Channel::from_str("3.0.1-5.6.beta"), Ok(Channel::Beta));
61 }
62
63 #[test]
64 fn format_str_test() {
65 assert_eq!(Channel::Dev.to_str(), "dev");
66 assert_eq!(Channel::Beta.to_str(), "beta");
67 assert_eq!(Channel::Stable.to_str(), "stable");
68 }
69}