aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeckoEidechse <40122905+GeckoEidechse@users.noreply.github.com>2023-02-06 08:31:48 +0100
committerGitHub <noreply@github.com>2023-02-06 08:31:48 +0100
commit478536e663553391726db2460db40ee5f58f8325 (patch)
tree2ce4273f30e2230a9c052a964b58c151f78c76a9
parent724d3062ef0a2f765ace879171e3055c0ea79b27 (diff)
downloadFlightCore-478536e663553391726db2460db40ee5f58f8325.tar.gz
FlightCore-478536e663553391726db2460db40ee5f58f8325.zip
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...
-rw-r--r--src-tauri/src/mod_management/mod.rs82
1 files 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<String>,
+}
+
/// 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<String, anyhow::Error> {
- // 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<String, anyhow::Error> {
- // 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<String, anyhow::Error> {
- 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<String, anyho
}
/// Parse `mods` folder for installed mods.
-fn parse_installed_mods(game_install: GameInstall) -> Result<Vec<NorthstarMod>, String> {
+fn parse_installed_mods(game_install: GameInstall) -> Result<Vec<NorthstarMod>, 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<PathBuf> = Vec::new();
@@ -224,23 +187,31 @@ fn parse_installed_mods(game_install: GameInstall) -> Result<Vec<NorthstarMod>,
}
// 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<Vec<NorthstarMod>, 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) {