1use crate::{framework_version, framework_versions, version::FrameworkVersion};
2
3pub const LAST_VERSION: FrameworkVersion = framework_version!(0.62.1);
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];
108
109#[rustfmt::skip]
110pub const CHECK_AFTER_UPGRADE_TO: &[FrameworkVersion] = framework_versions![
111 0.28.0,
112 0.29.0,
113 0.30.0,
114 0.31.0,
115 0.32.0,
116 0.33.0,
117 0.34.0,
118 0.35.0,
119 0.36.0,
120 0.37.0,
121 0.40.0,
122 0.41.0,
123 0.42.0,
124 0.43.0,
125 0.44.0,
126 0.45.2,
127 0.46.0,
128 0.47.0,
129 0.49.0,
130 0.50.6,
131 0.51.1,
132 0.52.3,
133 0.53.2,
134 0.54.6,
135 0.55.0,
136 0.56.1,
137 0.57.1,
138 0.58.0,
139 0.59.1,
140 0.61.0,
141 0.62.1,
142];
143
144pub const LOWER_VERSION_WITH_TEMPLATE_TAG: FrameworkVersion = framework_version!(0.43.0);
145pub const LOWER_VERSION_WITH_AUTOGENERATED_JSON: FrameworkVersion = framework_version!(0.44.0);
146pub const LOWER_VERSION_WITH_AUTOGENERATED_WASM: FrameworkVersion = framework_version!(0.45.0);
147
148pub fn parse_known_version(tag_str: &str) -> FrameworkVersion {
149 let tag: FrameworkVersion = FrameworkVersion::from_string_template(tag_str);
150 if VERSIONS.contains(&tag) {
151 tag
152 } else {
153 panic!("Version unknown")
154 }
155}
156
157pub fn validate_template_tag(tag_str: &str) -> bool {
159 let tag: FrameworkVersion = parse_known_version(tag_str);
160
161 tag >= LOWER_VERSION_WITH_TEMPLATE_TAG
162}
163
164pub fn is_template_with_autogenerated_wasm(tag: FrameworkVersion) -> bool {
165 tag >= LOWER_VERSION_WITH_AUTOGENERATED_WASM
166}
167
168pub fn is_template_with_autogenerated_json(tag: FrameworkVersion) -> bool {
169 tag >= LOWER_VERSION_WITH_AUTOGENERATED_JSON
170}
171
172pub fn find_version_by_str(tag: &str) -> Option<&FrameworkVersion> {
173 VERSIONS.iter().find(|&v| v.to_string() == tag)
174}
175
176pub struct VersionIterator {
177 next_version: usize,
178 last_version: FrameworkVersion,
179}
180
181impl VersionIterator {
182 fn is_last_version(&self, version: &FrameworkVersion) -> bool {
183 self.last_version == *version
184 }
185}
186
187impl Iterator for VersionIterator {
188 type Item = (&'static FrameworkVersion, &'static FrameworkVersion);
189
190 fn next(&mut self) -> Option<Self::Item> {
191 if self.next_version > 0 && self.next_version < VERSIONS.len() {
192 let from_version = &VERSIONS[self.next_version - 1];
193
194 if self.is_last_version(from_version) {
195 None
196 } else {
197 let to_version = &VERSIONS[self.next_version];
198 let result = (from_version, to_version);
199 self.next_version += 1;
200 Some(result)
201 }
202 } else {
203 None
204 }
205 }
206}
207
208pub fn versions_iter(last_version: FrameworkVersion) -> VersionIterator {
209 VersionIterator {
210 next_version: 1,
211 last_version,
212 }
213}
214
215#[cfg(test)]
216pub mod tests {
217
218 use crate::version::is_sorted;
219
220 use super::*;
221
222 #[test]
223 fn compare_versions_test() {
224 let f1: FrameworkVersion = framework_version!(0.44.0);
225 let f2: FrameworkVersion = framework_version!(0.41.2);
226
227 assert!(f1 > f2);
228 }
229
230 #[test]
231 fn framework_version_display_test() {
232 assert_eq!(format!("Framework: {}", VERSIONS[0]), "Framework: 0.28.0");
233 }
234
235 #[test]
236 fn template_versions_test() {
237 assert!(validate_template_tag("0.43.0"));
238 assert!(!validate_template_tag("0.42.0"));
239 }
240
241 #[test]
242 fn template_versions_with_autogenerated_wasm_test() {
243 assert!(is_template_with_autogenerated_wasm(framework_version!(
244 0.45.0
245 )));
246 assert!(!is_template_with_autogenerated_wasm(framework_version!(
247 0.44.0
248 )));
249 }
250
251 #[test]
252 fn template_versions_with_autogenerated_json_test() {
253 assert!(is_template_with_autogenerated_json(framework_version!(
254 0.44.0
255 )));
256 assert!(!is_template_with_autogenerated_json(framework_version!(
257 0.43.0
258 )));
259 }
260
261 #[test]
262 fn find_version_by_str_test() {
263 let version = find_version_by_str("0.28.0");
264 match version {
265 Some(v) => assert_eq!(VERSIONS[0], *v),
266 None => unreachable!(),
267 }
268 }
269
270 #[test]
271 fn framework_version_test() {
272 assert!(is_sorted(VERSIONS));
273 }
274}