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