rpgmxp_tool/commands/compile_assets/
vx.rs1use 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 }
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 }
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 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}