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