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