From 6b74d78747636279ea9b703cee4c88ad2a4916c6 Mon Sep 17 00:00:00 2001 From: Timo Ley Date: Fri, 1 Sep 2023 12:08:45 +0200 Subject: [PATCH] feat: update to new spec version --- crates/model/Cargo.toml | 1 + crates/model/src/api.rs | 6 ++--- crates/model/src/enums.rs | 22 +++++++++++++++- crates/model/src/error.rs | 6 +++++ crates/model/src/lib.rs | 54 ++++++++++++++++++++++++++++++++------- 5 files changed, 76 insertions(+), 13 deletions(-) create mode 100644 crates/model/src/error.rs diff --git a/crates/model/Cargo.toml b/crates/model/Cargo.toml index af660ea..93092c3 100644 --- a/crates/model/Cargo.toml +++ b/crates/model/Cargo.toml @@ -8,4 +8,5 @@ serde = { version = "1.0", features = ["derive"] } serde-enum-str = "0.3" serde_json = "1.0" url = {version = "2.2.2", features = ["serde"]} +thiserror = "1.0.30" addonscript-versioning = { path = "../versioning" } \ No newline at end of file diff --git a/crates/model/src/api.rs b/crates/model/src/api.rs index a3730a8..6542a16 100644 --- a/crates/model/src/api.rs +++ b/crates/model/src/api.rs @@ -4,7 +4,7 @@ use addonscript_versioning::Version; use serde::{Deserialize, Serialize}; use url::Url; -use crate::{AddonDescriptor, enums::APIFeature, LaunchConfig}; +use crate::{AddonDescriptor, enums::APIFeature, Patch}; use super::{AddonScript, File, Hashes, Meta}; @@ -49,9 +49,9 @@ pub struct EnvBuilderResponse { pub addonscript: AddonScript, pub files: Vec, #[serde(skip_serializing_if = "Option::is_none")] - pub launch_client: Option, + pub launch_client: Option, #[serde(skip_serializing_if = "Option::is_none")] - pub launch_server: Option, + pub launch_server: Option, } #[derive(Debug, Serialize, Deserialize)] diff --git a/crates/model/src/enums.rs b/crates/model/src/enums.rs index db66081..15bae7d 100644 --- a/crates/model/src/enums.rs +++ b/crates/model/src/enums.rs @@ -11,7 +11,7 @@ pub enum Flag { Launch, Env, Expected, - Library, + Patch, } #[derive(Debug, Deserialize_enum_str, Serialize_enum_str, PartialEq, Eq, Hash)] @@ -21,6 +21,7 @@ pub enum InstallAction { Extract, Rename, Inject, + Library, #[serde(other)] Unknown(String), } @@ -42,4 +43,23 @@ pub enum Side { Server, #[default] Both, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[serde(rename_all = "lowercase")] +pub enum ArgumentMode { + Replace, + Append, + Expand, + Override, +} + +impl Side { + pub fn compatbile_with(&self, other: &Self) -> bool { + match self { + Side::Client => other == &Self::Client || other == &Self::Both, + Side::Server => other == &Self::Server || other == &Self::Both, + Side::Both => true, + } + } } \ No newline at end of file diff --git a/crates/model/src/error.rs b/crates/model/src/error.rs new file mode 100644 index 0000000..b095bee --- /dev/null +++ b/crates/model/src/error.rs @@ -0,0 +1,6 @@ +use thiserror::Error; +#[derive(Debug, Error)] +pub enum Error { + #[error("The parsed AddonScript manifest violates the AddonScript spec")] + InvalidFormat, +} \ No newline at end of file diff --git a/crates/model/src/lib.rs b/crates/model/src/lib.rs index 6af2a0e..341956b 100644 --- a/crates/model/src/lib.rs +++ b/crates/model/src/lib.rs @@ -1,7 +1,8 @@ use std::collections::HashSet; use addonscript_versioning::{Version, VersionRestriction}; -use enums::Side; +use enums::{Side, ArgumentMode}; +use error::Error; use serde::{Deserialize, Serialize}; use url::Url; @@ -11,6 +12,7 @@ pub use self::{ }; pub mod api; +pub mod error; pub mod enums; pub mod meta; @@ -30,11 +32,10 @@ pub struct Manifest { #[serde(default)] pub instance: bool, #[serde(default)] + #[deprecated] pub use_builder: bool, - #[serde(skip_serializing_if = "Option::is_none")] - pub launch_client: Option, - #[serde(skip_serializing_if = "Option::is_none")] - pub launch_server: Option, + #[serde(default)] + pub patches: Vec, #[serde(skip_serializing_if = "Option::is_none")] pub meta: Option, } @@ -120,19 +121,31 @@ pub struct Flags { } #[derive(Debug, Serialize, Deserialize)] -pub struct LaunchConfig { - #[serde(skip_serializing_if = "Option::is_none")] - pub main_file: Option, +pub struct Patch { + pub side: Side, #[serde(skip_serializing_if = "Option::is_none")] pub main_class: Option, #[serde(default)] - pub arguments: Vec, + pub arguments: Vec, #[serde(default)] pub jvm_arguments: Vec, + #[serde(default)] + pub replace_jvm_arguments: bool, #[serde(skip_serializing_if = "Option::is_none")] pub java_version: Option, } +#[derive(Debug, Serialize, Deserialize)] +pub struct GameArgument { + pub mode: ArgumentMode, + #[serde(skip_serializing_if = "Option::is_none")] + pub key: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub value: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub raw: Option, +} + impl VersionlessManifest { pub fn get_version(&self) -> u8 { match &self.addonscript { @@ -175,3 +188,26 @@ impl Flags { false } } + +impl Manifest { + pub fn get_file(&self, qualifier: String) -> Option<&File> { + for file in &self.files { + if file.qualifier == qualifier { + return Some(file); + } + } + None + } +} + +impl GameArgument { + pub fn format_argument(&self) -> Result { + if let Some(raw) = &self.raw { + Ok(raw.clone()) + } else { + let key = self.key.clone().ok_or(Error::InvalidFormat)?; + let value = self.value.clone().unwrap_or_else(|| "".to_string()); + Ok(format!("--{} {}", key, value)) + } + } +} \ No newline at end of file