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