rpgmxp_tool/commands/compile_assets/
vx.rs

1use super::generate_map_infos_data;
2use super::generate_ruby_data;
3use super::generate_scripts_data;
4use super::set_extension_str;
5use super::FileSink;
6use anyhow::Context;
7use std::fs::File;
8use std::path::Path;
9
10pub fn compile(
11    entry_path: &Path,
12    entry_file_type: std::fs::FileType,
13    relative_path: &Path,
14    relative_path_components: Vec<&str>,
15    file_sink: &mut FileSink,
16) -> anyhow::Result<()> {
17    match relative_path_components.as_slice() {
18        ["Data", "Scripts.rvdata"] if entry_file_type.is_dir() => {
19            println!("packing \"{}\"", relative_path.display());
20
21            let scripts_data = generate_scripts_data(entry_path)?;
22            let size = u32::try_from(scripts_data.len())?;
23
24            file_sink.write_file(&relative_path_components, size, &*scripts_data)?;
25        }
26        ["Data", "Scripts.rvdata", ..] => {
27            // Ignore entries, we explore them in the above branch.
28        }
29        ["Data", "MapInfos.rvdata"] if entry_file_type.is_dir() => {
30            println!("packing \"{}\"", relative_path.display());
31
32            let data = generate_map_infos_data(entry_path)?;
33            let size = u32::try_from(data.len())?;
34
35            file_sink.write_file(&relative_path_components, size, &*data)?;
36        }
37        ["Data", "MapInfos.rvdata", ..] => {
38            // Ignore entries, we explore them in the above branch.
39        }
40        ["Data", "System.json"] if entry_file_type.is_file() => {
41            println!("packing \"{}\"", relative_path.display());
42
43            let data = generate_ruby_data::<rpgmvx_types::System>(entry_path)?;
44            let size = u32::try_from(data.len())?;
45
46            let mut relative_path_components = relative_path_components.clone();
47            *relative_path_components.last_mut().unwrap() = "System.rvdata";
48
49            file_sink.write_file(&relative_path_components, size, &*data)?;
50        }
51        ["Data", file] if crate::util::is_map_file_name(file, "json") => {
52            println!("packing \"{}\"", relative_path.display());
53
54            let map_data = generate_ruby_data::<rpgmvx_types::Map>(entry_path)?;
55            let size = u32::try_from(map_data.len())?;
56
57            let renamed_file = set_extension_str(file, "rvdata");
58            let mut relative_path_components = relative_path_components.clone();
59            *relative_path_components.last_mut().unwrap() = renamed_file.as_str();
60
61            file_sink.write_file(&relative_path_components, size, &*map_data)?;
62        }
63        relative_path_components if entry_file_type.is_file() => {
64            // Copy file by default
65            println!("packing \"{}\"", relative_path.display());
66
67            let input_file = File::open(entry_path).with_context(|| {
68                format!(
69                    "failed to open input file from \"{}\"",
70                    entry_path.display()
71                )
72            })?;
73            let metadata = input_file.metadata()?;
74            let size = u32::try_from(metadata.len())?;
75
76            file_sink.write_file(relative_path_components, size, input_file)?;
77        }
78        _ => {}
79    }
80
81    Ok(())
82}