bevy_yoleck/
level_files_upgrading.rs1use bevy::prelude::*;
2
3pub fn upgrade_level_file(mut level: serde_json::Value) -> Result<serde_json::Value> {
5 let parts = level.as_array_mut().ok_or("Level file must be an array")?;
6 let mut format_version = parts
7 .first()
8 .ok_or("Level file array must not be empty")?
9 .as_object()
10 .ok_or("Level file header must be an object")?
11 .get("format_version")
12 .ok_or("Level file header must have a `format_version` field")?
13 .as_u64()
14 .ok_or("`format_version` must be a non-negative number")?;
15
16 #[allow(clippy::single_element_loop)]
17 for (upgrade_to, upgrade_fn) in [(2, upgrade_level_file_1_to_2)] {
18 if format_version < upgrade_to {
19 upgrade_fn(parts)?;
20 format_version = upgrade_to;
21 }
22 }
23
24 parts[0].as_object_mut().expect("already verified")["format_version"] = format_version.into();
25
26 Ok(level)
27}
28
29fn upgrade_level_file_1_to_2(parts: &mut [serde_json::Value]) -> Result<()> {
30 let header = parts
31 .get_mut(0)
32 .ok_or("Level file must have header as first element")?
33 .as_object_mut()
34 .ok_or("Header must be object")?;
35 header.insert("app_format_version".to_owned(), 0.into());
36
37 let entities = parts
38 .get_mut(2)
39 .ok_or("Level file must have entities list as third element")?
40 .as_array_mut()
41 .ok_or("Entity list must be array")?;
42
43 for entity in entities.iter_mut() {
44 let entity_type = entity
45 .pointer("/0/type")
46 .ok_or("Entity must have a header with a `type` field")?
47 .as_str()
48 .ok_or("Entity `type` must be a string")?
49 .to_owned();
50 let entity_data = entity.get_mut(1).ok_or("Entity must have data")?;
51 let orig_data = entity_data.take();
52 *entity_data = serde_json::Value::Object(Default::default());
53 entity_data[entity_type] = orig_data;
54 }
55 Ok(())
56}