1#![warn(clippy::all)]
16#![deny(unsafe_code)]
17#![deny(missing_docs)]
18
19#[derive(Clone, Debug, Eq, PartialEq)]
21pub struct RustRelease {
22 version: ReleaseVersion,
23 release_date: Option<rust_toolchain::Date>,
24 toolchains: Vec<ExtendedToolchain>,
25}
26
27impl RustRelease {
28 pub fn new(
31 version: ReleaseVersion,
32 release_date: Option<rust_toolchain::Date>,
33 toolchains: impl IntoIterator<Item = ExtendedToolchain>,
34 ) -> Self {
35 Self {
36 version,
37 release_date,
38 toolchains: toolchains.into_iter().collect(),
39 }
40 }
41
42 pub fn version(&self) -> &ReleaseVersion {
44 &self.version
45 }
46
47 pub fn release_date(&self) -> Option<&rust_toolchain::Date> {
49 self.release_date.as_ref()
50 }
51
52 pub fn toolchains(&self) -> impl Iterator<Item = &ExtendedToolchain> {
54 self.toolchains.iter()
55 }
56}
57
58#[derive(Clone, Debug, Eq, PartialEq)]
63pub enum ReleaseVersion {
64 Stable(rust_toolchain::channel::Stable),
66 Beta(rust_toolchain::channel::Beta),
68 Nightly(rust_toolchain::channel::Nightly),
70}
71
72#[derive(Clone, Debug, Eq, PartialEq)]
75pub struct ExtendedToolchain {
76 toolchain: rust_toolchain::Toolchain,
77 tier: TargetTier,
78}
79
80impl ExtendedToolchain {
81 pub fn new(toolchain: rust_toolchain::Toolchain, tier: TargetTier) -> Self {
83 Self { toolchain, tier }
84 }
85
86 pub fn toolchain(&self) -> &rust_toolchain::Toolchain {
88 &self.toolchain
89 }
90
91 pub fn tier(&self) -> TargetTier {
93 self.tier
94 }
95}
96
97#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq)]
99pub enum TargetTier {
100 T1,
102 T2,
104 T2_5,
106 T3,
108 Unknown,
110}
111
112#[cfg(test)]
113mod tests {
114 use super::*;
115 use std::collections::HashSet;
116
117 #[test]
118 fn can_instantiate() {
119 let stable_version = rust_toolchain::channel::Stable {
120 version: rust_toolchain::RustVersion::new(1, 82, 0),
121 };
122 let version = ReleaseVersion::Stable(stable_version.clone());
123
124 let release = RustRelease::new(
125 version,
126 None,
127 vec![ExtendedToolchain::new(
128 rust_toolchain::Toolchain::new(
129 rust_toolchain::Channel::Stable(stable_version.clone()),
130 None,
131 rust_toolchain::Target::host(),
132 HashSet::new(),
133 HashSet::new(),
134 ),
135 TargetTier::Unknown,
136 )],
137 );
138
139 let release_version = release.version();
140 assert_eq!(release_version, &ReleaseVersion::Stable(stable_version));
141 }
142
143 #[yare::parameterized(
144 some = { Some(rust_toolchain::Date::new(2024, 1, 1)) },
145 none = { None },
146 )]
147 fn can_instantiate_deux(date: Option<rust_toolchain::Date>) {
148 let stable_version = rust_toolchain::channel::Stable {
149 version: rust_toolchain::RustVersion::new(1, 82, 0),
150 };
151 let version = ReleaseVersion::Stable(stable_version.clone());
152
153 let release = RustRelease::new(
154 version,
155 date.clone(),
156 vec![ExtendedToolchain::new(
157 rust_toolchain::Toolchain::new(
158 rust_toolchain::Channel::Stable(stable_version.clone()),
159 date,
160 rust_toolchain::Target::host(),
161 HashSet::new(),
162 HashSet::new(),
163 ),
164 TargetTier::Unknown,
165 )],
166 );
167
168 let release_date = release.release_date();
169 let target_date = release.toolchains().next().unwrap().toolchain().date();
170
171 assert_eq!(release_date, target_date);
172 }
173}