rust_toolchain/
channel.rs1mod beta;
2mod nightly;
3mod stable;
4
5use crate::{Date, RustVersion};
6
7pub use beta::Beta;
8pub use nightly::Nightly;
9pub use stable::Stable;
10
11#[derive(Clone, Debug, Eq, Hash, PartialEq)]
33pub enum Channel {
34 Stable(Stable),
36 Beta(Beta),
38 Nightly(Nightly),
40}
41
42impl Channel {
43 pub fn stable(version: RustVersion) -> Self {
45 Channel::Stable(Stable { version })
46 }
47
48 pub fn beta(version: RustVersion) -> Self {
50 Channel::Beta(Beta {
51 version,
52 prerelease: None,
53 })
54 }
55
56 pub fn nightly(date: Date) -> Self {
58 Channel::Nightly(Nightly { date })
59 }
60
61 pub fn is_stable(&self) -> bool {
63 matches!(self, Self::Stable(_))
64 }
65
66 pub fn is_beta(&self) -> bool {
68 matches!(self, Self::Beta(_))
69 }
70
71 pub fn is_nightly(&self) -> bool {
73 matches!(self, Self::Nightly(_))
74 }
75
76 pub fn version(&self) -> Option<RustVersion> {
78 match self {
79 Channel::Stable(v) => Some(v.version),
80 Channel::Beta(v) => Some(v.version),
81 Channel::Nightly(_) => None,
82 }
83 }
84
85 pub fn date(&self) -> Option<Date> {
87 match self {
88 Channel::Stable(_) => None,
89 Channel::Beta(_) => None,
90 Channel::Nightly(v) => Some(v.date.clone()),
91 }
92 }
93}
94
95#[cfg(test)]
96mod tests {
97 use super::*;
98 use crate::{Date, RustVersion};
99 use yare::parameterized;
100
101 #[test]
102 fn create_channel_stable() {
103 let stable = Channel::stable(RustVersion::new(1, 2, 3));
104
105 assert!(stable.is_stable());
106 assert!(!stable.is_beta());
107 assert!(!stable.is_nightly());
108 }
109
110 #[test]
111 fn create_channel_beta() {
112 let stable = Channel::beta(RustVersion::new(1, 2, 3));
113
114 assert!(!stable.is_stable());
115 assert!(stable.is_beta());
116 assert!(!stable.is_nightly());
117 }
118
119 #[test]
120 fn create_channel_nightly() {
121 let stable = Channel::nightly(Date::new(1, 1, 1));
122
123 assert!(!stable.is_stable());
124 assert!(!stable.is_beta());
125 assert!(stable.is_nightly());
126 }
127
128 #[parameterized(
129 stable = { Channel::stable("1.2.3".parse().unwrap()), Some(RustVersion::new(1,2,3)) },
130 beta = { Channel::beta("1.2.3".parse().unwrap()), Some(RustVersion::new(1,2,3)) },
131 nightly = { Channel::nightly(Date::new(2024, 1, 1)), None }
132 )]
133 fn version(c: Channel, expected: Option<RustVersion>) {
134 assert_eq!(c.version(), expected)
135 }
136}