dart_semver/
channel.rs

1use std::str::FromStr;
2
3/// Possible values for Dart SDK channels
4#[derive(Debug, Default, PartialEq, Clone, Copy)]
5pub enum Channel {
6    #[default]
7    Stable,
8    Beta,
9    Dev,
10}
11
12impl Channel {
13    /// Returns a string version of the channel
14    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}