From 478536e663553391726db2460db40ee5f58f8325 Mon Sep 17 00:00:00 2001 From: GeckoEidechse <40122905+GeckoEidechse@users.noreply.github.com> Date: Mon, 6 Feb 2023 08:31:48 +0100 Subject: refactor: Parse using serde deserialisation (#158) * refactor: Parse using serde deserialisation * refactor: Parse using serde deserial. (TS mod str) Reduce code by making use of serde deserialisation. Still supports legacy method * chore: Remove commented out fields While useful, it just made the code messy... --- src-tauri/src/mod_management/mod.rs | 82 +++++++++++++------------------------ 1 file changed, 28 insertions(+), 54 deletions(-) diff --git a/src-tauri/src/mod_management/mod.rs b/src-tauri/src/mod_management/mod.rs index d269a627..01e2cbb5 100644 --- a/src-tauri/src/mod_management/mod.rs +++ b/src-tauri/src/mod_management/mod.rs @@ -51,6 +51,14 @@ pub struct ThunderstoreManifest { version_number: String, } +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ModJson { + #[serde(rename = "Name")] + name: String, + #[serde(rename = "ThunderstoreModString")] + thunderstore_mod_string: Option, +} + /// Gets all currently installed and enabled/disabled mods to rebuild `enabledmods.json` pub fn rebuild_enabled_mods_json(game_install: GameInstall) -> Result<(), String> { let enabledmods_json_path = format!("{}/R2Northstar/enabledmods.json", game_install.game_path); @@ -124,56 +132,11 @@ pub fn set_mod_enabled_status( Ok(()) } -/// Parses `mod.json` for mod name -// TODO: Maybe pass PathBuf or serde json object -fn parse_mod_json_for_mod_name(mod_json_path: String) -> Result { - // Read file into string and parse it - let data = std::fs::read_to_string(mod_json_path)?; - let parsed_json: serde_json::Value = json5::from_str(&data)?; - - // Extract mod name - let mod_name = match parsed_json.get("Name").and_then(|value| value.as_str()) { - Some(name) => name, - None => return Err(anyhow!("No name found")), - }; - - Ok(mod_name.to_string()) -} - -/// Parses `mod.json` for Thunderstore mod string -/// This is a legacy function as nowadays `manifest.json` should be in Northtar mods folder and read from there -// TODO: Maybe pass PathBuf or serde json object -fn parse_mod_json_for_thunderstore_mod_string( - mod_json_path: String, -) -> Result { - // Read file into string and parse it - let data = std::fs::read_to_string(mod_json_path)?; - let parsed_json: serde_json::Value = json5::from_str(&data)?; - - // Extract TS mod string - let thunderstore_mod_string = match parsed_json - .get("ThunderstoreModString") - .and_then(|value| value.as_str()) - { - Some(thunderstore_mod_string) => thunderstore_mod_string, - None => return Err(anyhow!("No ThunderstoreModString found")), - }; - - Ok(thunderstore_mod_string.to_string()) -} - /// Parses `manifest.json` for Thunderstore mod string fn parse_for_thunderstore_mod_string(nsmod_path: String) -> Result { - let mod_json_path = format!("{}/mod.json", nsmod_path); let manifest_json_path = format!("{}/manifest.json", nsmod_path); let ts_author_txt_path = format!("{}/thunderstore_author.txt", nsmod_path); - // Attempt legacy method for getting Thunderstore string first - match parse_mod_json_for_thunderstore_mod_string(mod_json_path) { - Ok(thunderstore_mod_string) => return Ok(thunderstore_mod_string), - Err(_err) => (), - } - // Check if `manifest.json` exists and parse let data = std::fs::read_to_string(manifest_json_path)?; let thunderstore_manifest: ThunderstoreManifest = json5::from_str(&data)?; @@ -193,12 +156,12 @@ fn parse_for_thunderstore_mod_string(nsmod_path: String) -> Result Result, String> { +fn parse_installed_mods(game_install: GameInstall) -> Result, anyhow::Error> { let ns_mods_folder = format!("{}/R2Northstar/mods/", game_install.game_path); let paths = match std::fs::read_dir(ns_mods_folder) { Ok(paths) => paths, - Err(_err) => return Err("No mods folder found".to_string()), + Err(_err) => return Err(anyhow!("No mods folder found")), }; let mut directories: Vec = Vec::new(); @@ -224,23 +187,31 @@ fn parse_installed_mods(game_install: GameInstall) -> Result, } // Parse mod.json and get mod name - let mod_name = match parse_mod_json_for_mod_name(mod_json_path.clone()) { - Ok(mod_name) => mod_name, + + // Read file into string and parse it + let data = std::fs::read_to_string(mod_json_path.clone())?; + let parsed_mod_json: ModJson = match json5::from_str(&data) { + Ok(parsed_json) => parsed_json, Err(err) => { println!("Failed parsing {} with {}", mod_json_path, err.to_string()); continue; } }; // Get Thunderstore mod string if it exists - let thunderstore_mod_string = match parse_for_thunderstore_mod_string(directory_str) { - Ok(thunderstore_mod_string) => Some(thunderstore_mod_string), - Err(_err) => None, + let thunderstore_mod_string = match parsed_mod_json.thunderstore_mod_string { + // Attempt legacy method for getting Thunderstore string first + Some(ts_mod_string) => Some(ts_mod_string), + // Legacy method failed + None => match parse_for_thunderstore_mod_string(directory_str) { + Ok(thunderstore_mod_string) => Some(thunderstore_mod_string), + Err(_err) => None, + }, }; // Get directory path let mod_directory = directory.to_str().unwrap().to_string(); let ns_mod = NorthstarMod { - name: mod_name, + name: parsed_mod_json.name, thunderstore_mod_string: thunderstore_mod_string, enabled: false, // Placeholder directory: mod_directory, @@ -261,7 +232,10 @@ pub fn get_installed_mods_and_properties( game_install: GameInstall, ) -> Result, String> { // Get actually installed mods - let found_installed_mods = parse_installed_mods(game_install.clone())?; + let found_installed_mods = match parse_installed_mods(game_install.clone()) { + Ok(res) => res, + Err(err) => return Err(err.to_string()), + }; // Get enabled mods as JSON let enabled_mods: serde_json::Value = match get_enabled_mods(game_install) { -- cgit v1.2.3