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