#![allow(unused_variables)] #![allow(unused_imports)] use indexmap::IndexMap;
use serde_json;
use std::fs;
use std::path::{Path, PathBuf};
type PdError = Result<(), Box<dyn std::error::Error>>;
fn map_exists(map: &str) -> bool {
let paths = get_paths(map);
for path in paths {
if !path.exists() {
eprintln!("Error: '{}' does not exist! Have you tried to delete this map on your own?\nCheck the spelling of the map again.", path.display());
return false;
}
}
true
}
fn get_str_to_be_del(map: &str) -> Vec<String> {
vec![
String::from(map),
String::from(map) + "_Layout",
String::from(".include \"data/maps/") + map + "/scripts.inc\"",
]
}
fn get_paths(map: &str) -> Vec<PathBuf> {
vec![
Path::new("./data/maps/").to_path_buf().join(map),
Path::new("./data/maps/map_groups.json").to_path_buf(),
Path::new("./data/layouts/").to_path_buf().join(map),
Path::new("./data/layouts/layouts.json").to_path_buf(),
Path::new("./data/event_scripts.s").to_path_buf(),
]
}
fn remove_dirs(map: PathBuf, layouts: PathBuf) -> PdError {
fs::remove_dir_all(map.clone())?;
if !map.exists() {
println!(
"Step 1: Map folder deleted! Folder directory '{}'",
map.display()
);
} else {
eprintln!("Error: Failed to delete map folder '{}'", map.display());
}
fs::remove_dir_all(layouts.clone())?;
if !layouts.exists() {
println!(
"Step 2: Map folder deleted! Folder directory '{}'",
layouts.display()
);
} else {
eprintln!(
"Error: Failed to delete layouts folder '{}'",
layouts.display()
);
}
Ok(())
}
fn remove_include(path: PathBuf, string: String) -> PdError {
if path.exists() {
let content = fs::read_to_string(path.clone())?.replace(&string, "");
fstream::write_text(path, content, true);
println!("Step 3: Include file deleted!");
}
Ok(())
}
fn remove_layouts_map_object(path: PathBuf, layout_name: String) -> PdError {
if path.is_file() {
if path.file_name().and_then(|n| n.to_str()) == Some("layouts.json") {
let contents = fs::read_to_string(&path)?;
let mut map: serde_json::Value =
serde_json::from_str(&contents).expect("Error: failed to parse map.json");
if let Some(layouts) = map.get_mut("layouts") {
if let Some(layouts_array) = layouts.as_array_mut() {
layouts_array.retain(|layout| {
if let Some(layout_id) = layout.get("name") {
return layout_id != layout_name.as_str();
}
true
});
let del_obj_json = serde_json::to_string_pretty(&map)
.expect("Error: failed to serialize map.json");
let mut indexmap: IndexMap<String, serde_json::Value> =
serde_json::from_str(&del_obj_json)?;
indexmap.insert(
String::from("layouts_table_label"),
serde_json::Value::String(String::from("gMapLayouts")),
);
let modified_json = serde_json::to_string_pretty(&indexmap)?;
fstream::write_text(path, modified_json, true).unwrap();
println!("Step 4: Layouts.json file modified!");
} else {
eprintln!("Error: layouts.json is not an array.");
}
}
}
}
Ok(())
}
fn remove_map_groups_map_name(path: PathBuf, name: String) -> PdError {
if path.is_file() {
if path.file_name().and_then(|n| n.to_str()) == Some("map_groups.json") {
let contents = fs::read_to_string(&path)?;
let mut map: serde_json::Value =
serde_json::from_str(&contents).expect("Error: failed to parse map.json");
if let Some(array) = map.pointer_mut("/gMapGroup_TownsAndRoutes") {
if let Some(array) = array.as_array_mut() {
array.retain(|item| item != name.as_str());
}
let modified_json = serde_json::to_string_pretty(&map)
.expect("Error: failed to serialize map.json");
println!("Step 5: map_groups.json file modified!");
fstream::write_text(path, modified_json, true).unwrap();
} else {
eprintln!("Error: map_groups.json is not an array.");
}
}
}
Ok(())
}
pub fn execute_del(map: &str) -> PdError {
let map_exists = map_exists(map);
if map_exists {
let strings = get_str_to_be_del(map);
let paths = get_paths(map);
remove_dirs(paths[0].clone(), paths[2].clone())?;
remove_include(paths[4].clone(), strings[2].clone())?;
remove_layouts_map_object(paths[3].clone(), strings[1].clone())?;
remove_map_groups_map_name(paths[1].clone(), strings[0].clone())?;
println!("Success: Deleted map '{}'.", map);
println!("\nInportant Note: Other maps may use '{}' in their files. This can cause errors while compiling.\nMake sure to fix those errors!", map);
}
Ok(())
}