mod beta;
mod nightly;
mod stable;
use crate::{Date, RustVersion};
pub use beta::Beta;
pub use nightly::Nightly;
pub use stable::Stable;
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub enum Channel {
Stable(Stable),
Beta(Beta),
Nightly(Nightly),
}
impl Channel {
pub fn stable(version: RustVersion) -> Self {
Channel::Stable(Stable { version })
}
pub fn beta(version: RustVersion) -> Self {
Channel::Beta(Beta {
version,
prerelease: None,
})
}
pub fn nightly(date: Date) -> Self {
Channel::Nightly(Nightly { date })
}
pub fn is_stable(&self) -> bool {
matches!(self, Self::Stable(_))
}
pub fn is_beta(&self) -> bool {
matches!(self, Self::Beta(_))
}
pub fn is_nightly(&self) -> bool {
matches!(self, Self::Nightly(_))
}
pub fn version(&self) -> Option<RustVersion> {
match self {
Channel::Stable(v) => Some(v.version),
Channel::Beta(v) => Some(v.version),
Channel::Nightly(_) => None,
}
}
pub fn date(&self) -> Option<Date> {
match self {
Channel::Stable(_) => None,
Channel::Beta(_) => None,
Channel::Nightly(v) => Some(v.date.clone()),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{Date, RustVersion};
use yare::parameterized;
#[test]
fn create_channel_stable() {
let stable = Channel::stable(RustVersion::new(1, 2, 3));
assert!(stable.is_stable());
assert!(!stable.is_beta());
assert!(!stable.is_nightly());
}
#[test]
fn create_channel_beta() {
let stable = Channel::beta(RustVersion::new(1, 2, 3));
assert!(!stable.is_stable());
assert!(stable.is_beta());
assert!(!stable.is_nightly());
}
#[test]
fn create_channel_nightly() {
let stable = Channel::nightly(Date::new(1, 1, 1));
assert!(!stable.is_stable());
assert!(!stable.is_beta());
assert!(stable.is_nightly());
}
#[parameterized(
stable = { Channel::stable("1.2.3".parse().unwrap()), Some(RustVersion::new(1,2,3)) },
beta = { Channel::beta("1.2.3".parse().unwrap()), Some(RustVersion::new(1,2,3)) },
nightly = { Channel::nightly(Date::new(2024, 1, 1)), None }
)]
fn version(c: Channel, expected: Option<RustVersion>) {
assert_eq!(c.version(), expected)
}
}