1use crate::{framework_version, framework_versions, version::FrameworkVersion};
2
3pub const LAST_VERSION: FrameworkVersion = framework_version!(0.63.2);
7
8pub const LAST_UPGRADE_VERSION: FrameworkVersion = LAST_VERSION;
10
11pub const LAST_TEMPLATE_VERSION: FrameworkVersion = LAST_VERSION;
12
13#[rustfmt::skip]
14pub const VERSIONS: &[FrameworkVersion] = framework_versions![
16 0.28.0,
17 0.29.0,
18 0.29.2,
19 0.29.3,
20 0.30.0,
21 0.31.0,
22 0.31.1,
23 0.32.0,
24 0.33.0,
25 0.33.1,
26 0.34.0,
27 0.34.1,
28 0.35.0,
29 0.36.0,
30 0.36.1,
31 0.37.0,
32 0.38.0,
33 0.39.0,
34 0.39.1,
35 0.39.2,
36 0.39.3,
37 0.39.4,
38 0.39.5,
39 0.39.6,
40 0.39.7,
41 0.39.8,
42 0.40.0,
43 0.40.1,
44 0.41.0,
45 0.41.1,
46 0.41.2,
47 0.41.3,
48 0.42.0,
49 0.43.0,
50 0.43.1,
51 0.43.2,
52 0.43.3,
53 0.43.4,
54 0.43.5,
55 0.44.0,
56 0.45.0,
57 0.45.2,
58 0.46.0,
59 0.46.1,
60 0.47.0,
61 0.47.1,
62 0.47.2,
63 0.47.3,
64 0.47.4,
65 0.47.5,
66 0.47.6,
67 0.47.7,
68 0.47.8,
69 0.48.0,
70 0.48.1,
71 0.49.0,
72 0.50.0,
73 0.50.1,
74 0.50.2,
75 0.50.3,
76 0.50.4,
77 0.50.5,
78 0.50.6,
79 0.51.0,
80 0.51.1,
81 0.52.0,
82 0.52.1,
83 0.52.2,
84 0.52.3,
85 0.53.0,
86 0.53.1,
87 0.53.2,
88 0.54.0,
89 0.54.1,
90 0.54.2,
91 0.54.3,
92 0.54.4,
93 0.54.5,
94 0.54.6,
95 0.55.0,
96 0.56.0,
97 0.56.1,
98 0.57.0,
99 0.57.1,
100 0.58.0,
101 0.59.0,
102 0.59.1,
103 0.60.0,
104 0.61.0,
105 0.62.0,
106 0.62.1,
107 0.63.0,
108 0.63.1,
109 0.63.2,
110];
111
112#[rustfmt::skip]
113pub const CHECK_AFTER_UPGRADE_TO: &[FrameworkVersion] = framework_versions![
114 0.28.0,
115 0.29.0,
116 0.30.0,
117 0.31.0,
118 0.32.0,
119 0.33.0,
120 0.34.0,
121 0.35.0,
122 0.36.0,
123 0.37.0,
124 0.40.0,
125 0.41.0,
126 0.42.0,
127 0.43.0,
128 0.44.0,
129 0.45.2,
130 0.46.0,
131 0.47.0,
132 0.49.0,
133 0.50.6,
134 0.51.1,
135 0.52.3,
136 0.53.2,
137 0.54.6,
138 0.55.0,
139 0.56.1,
140 0.57.1,
141 0.58.0,
142 0.59.1,
143 0.61.0,
144 0.62.1,
145 0.63.2,
146];
147
148pub const LOWER_VERSION_WITH_TEMPLATE_TAG: FrameworkVersion = framework_version!(0.43.0);
149pub const LOWER_VERSION_WITH_AUTOGENERATED_JSON: FrameworkVersion = framework_version!(0.44.0);
150pub const LOWER_VERSION_WITH_AUTOGENERATED_WASM: FrameworkVersion = framework_version!(0.45.0);
151
152pub fn parse_known_version(tag_str: &str) -> FrameworkVersion {
153 let tag: FrameworkVersion = FrameworkVersion::from_string_template(tag_str);
154 if VERSIONS.contains(&tag) {
155 tag
156 } else {
157 panic!("Version unknown")
158 }
159}
160
161pub fn validate_template_tag(tag_str: &str) -> bool {
163 let tag: FrameworkVersion = parse_known_version(tag_str);
164
165 tag >= LOWER_VERSION_WITH_TEMPLATE_TAG
166}
167
168pub fn is_template_with_autogenerated_wasm(tag: FrameworkVersion) -> bool {
169 tag >= LOWER_VERSION_WITH_AUTOGENERATED_WASM
170}
171
172pub fn is_template_with_autogenerated_json(tag: FrameworkVersion) -> bool {
173 tag >= LOWER_VERSION_WITH_AUTOGENERATED_JSON
174}
175
176pub fn find_version_by_str(tag: &str) -> Option<&FrameworkVersion> {
177 VERSIONS.iter().find(|&v| v.to_string() == tag)
178}
179
180pub struct VersionIterator {
181 next_version: usize,
182 last_version: FrameworkVersion,
183}
184
185impl VersionIterator {
186 fn is_last_version(&self, version: &FrameworkVersion) -> bool {
187 self.last_version == *version
188 }
189}
190
191impl Iterator for VersionIterator {
192 type Item = (&'static FrameworkVersion, &'static FrameworkVersion);
193
194 fn next(&mut self) -> Option<Self::Item> {
195 if self.next_version > 0 && self.next_version < VERSIONS.len() {
196 let from_version = &VERSIONS[self.next_version - 1];
197
198 if self.is_last_version(from_version) {
199 None
200 } else {
201 let to_version = &VERSIONS[self.next_version];
202 let result = (from_version, to_version);
203 self.next_version += 1;
204 Some(result)
205 }
206 } else {
207 None
208 }
209 }
210}
211
212pub fn versions_iter(last_version: FrameworkVersion) -> VersionIterator {
213 VersionIterator {
214 next_version: 1,
215 last_version,
216 }
217}
218
219#[cfg(test)]
220pub mod tests {
221
222 use crate::version::is_sorted;
223
224 use super::*;
225
226 #[test]
227 fn compare_versions_test() {
228 let f1: FrameworkVersion = framework_version!(0.44.0);
229 let f2: FrameworkVersion = framework_version!(0.41.2);
230
231 assert!(f1 > f2);
232 }
233
234 #[test]
235 fn framework_version_display_test() {
236 assert_eq!(format!("Framework: {}", VERSIONS[0]), "Framework: 0.28.0");
237 }
238
239 #[test]
240 fn template_versions_test() {
241 assert!(validate_template_tag("0.43.0"));
242 assert!(!validate_template_tag("0.42.0"));
243 }
244
245 #[test]
246 fn template_versions_with_autogenerated_wasm_test() {
247 assert!(is_template_with_autogenerated_wasm(framework_version!(
248 0.45.0
249 )));
250 assert!(!is_template_with_autogenerated_wasm(framework_version!(
251 0.44.0
252 )));
253 }
254
255 #[test]
256 fn template_versions_with_autogenerated_json_test() {
257 assert!(is_template_with_autogenerated_json(framework_version!(
258 0.44.0
259 )));
260 assert!(!is_template_with_autogenerated_json(framework_version!(
261 0.43.0
262 )));
263 }
264
265 #[test]
266 fn find_version_by_str_test() {
267 let version = find_version_by_str("0.28.0");
268 match version {
269 Some(v) => assert_eq!(VERSIONS[0], *v),
270 None => unreachable!(),
271 }
272 }
273
274 #[test]
275 fn framework_version_test() {
276 assert!(is_sorted(VERSIONS));
277 }
278}