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