commit 5206d56cf8d0c283b4001644f7375bbf1017a56c Author: Timo Ley Date: Mon Nov 28 10:26:47 2022 +0100 init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..96ef6c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..087f842 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,9 @@ +[workspace] +members = [ + "crates/*", +] +default-members = ["crates/*"] +resolver = "2" + +[workspace.package] +rust-version = "1.65" \ No newline at end of file diff --git a/crates/model/Cargo.toml b/crates/model/Cargo.toml new file mode 100644 index 0000000..922f3ac --- /dev/null +++ b/crates/model/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "addonscript-model" +version = "0.1.0" +edition = "2018" + +[dependencies] +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +url = {version = "2.2.2", features = ["serde"]} \ No newline at end of file diff --git a/crates/model/src/api.rs b/crates/model/src/api.rs new file mode 100644 index 0000000..f18991c --- /dev/null +++ b/crates/model/src/api.rs @@ -0,0 +1,52 @@ +use serde::{Deserialize, Serialize}; + +use super::{AddonScript, File, Hashes, Meta}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct APIAddon { + pub id: String, + pub namespace: String, + pub versions: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + pub meta: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct APIFile { + pub link: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + pub hashes: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub meta: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct AddonDescriptor { + pub id: String, + pub namespace: String, + pub version: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct EnvObject { + #[serde(skip_serializing_if = "Option::is_none")] + pub requested: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub provided: Option>, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct EnvBuilderRequest { + pub addonscript: AddonScript, + pub addon: AddonDescriptor, + #[serde(skip_serializing_if = "Option::is_none")] + pub client: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub server: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct EnvBuilderResponse { + pub addonscript: AddonScript, + pub files: Vec, +} \ No newline at end of file diff --git a/crates/model/src/enums.rs b/crates/model/src/enums.rs new file mode 100644 index 0000000..29651cf --- /dev/null +++ b/crates/model/src/enums.rs @@ -0,0 +1,23 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[serde(rename_all = "lowercase")] +pub enum Flag { + Required, + Optional, + Included, + Instance, + Incompatible, + Launch, + Env +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[serde(rename_all = "lowercase")] +pub enum InstallAction { + Move, + Extract, + Rename, + Inject, + Unknown(String), +} \ No newline at end of file diff --git a/crates/model/src/lib.rs b/crates/model/src/lib.rs new file mode 100644 index 0000000..b1e12ee --- /dev/null +++ b/crates/model/src/lib.rs @@ -0,0 +1,133 @@ +use std::collections::HashSet; + +use serde::{Deserialize, Serialize}; + +pub use self::{enums::{Flag, InstallAction}, meta::*}; + +pub mod api; +pub mod meta; +pub mod enums; + +#[derive(Debug, Serialize, Deserialize)] +pub struct Manifest { + pub addonscript: AddonScript, + pub id: String, + pub namespace: String, + pub version: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub files : Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub relations: Option>, + pub flags: Flags, + #[serde(skip_serializing_if = "Option::is_none")] + pub repositories: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub meta: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct VersionlessManifest { + pub addonscript: AddonScript, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct AddonScript { + pub version: u8, +} + +impl Default for AddonScript { + fn default() -> Self { + Self { version: 2 } + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Repository { + pub namespace: String, + pub instances: Vec, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Relation { + pub id: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub namespace: Option, + pub version: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub repositories: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub flags: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct File { + pub qualifier: String, + pub link: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + pub install: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub flags: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub hashes: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Hashes { + #[serde(skip_serializing_if = "Option::is_none")] + pub sha1: Option, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Install { + pub action: InstallAction, + #[serde(skip_serializing_if = "Option::is_none")] + pub args: Option>, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Flags { + #[serde(skip_serializing_if = "Option::is_none")] + pub client: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub server: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub both: Option>, +} + +impl VersionlessManifest { + pub fn is_version_valid(&self) -> bool { + self.addonscript.version == 2 + } +} + +impl Flags { + + pub fn has_client_flag(&self, flag: &Flag) -> bool { + if let Some(flags) = &self.client { + if flags.contains(flag) { + return true; + } + } + if let Some(flags) = &self.both { + if flags.contains(flag) { + return true; + } + } + return false; + } + + pub fn has_server_flag(&self, flag: &Flag) -> bool { + if let Some(flags) = &self.server { + if flags.contains(flag) { + return true; + } + } + if let Some(flags) = &self.both { + if flags.contains(flag) { + return true; + } + } + return false; + } + +} \ No newline at end of file diff --git a/crates/model/src/meta.rs b/crates/model/src/meta.rs new file mode 100644 index 0000000..6616c98 --- /dev/null +++ b/crates/model/src/meta.rs @@ -0,0 +1,50 @@ +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use url::Url; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Meta { + #[serde(skip_serializing_if = "Option::is_none")] + pub addon: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub version: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub additional: Option, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct AddonMeta { + #[serde(skip_serializing_if = "Option::is_none")] + pub name: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub icon: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub description: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub summary: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub website: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub source: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub issues: Option, + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(rename = "type")] + pub addon_type: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub contributors: Option>, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct VersionMeta { + #[serde(skip_serializing_if = "Option::is_none")] + pub changelog: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub timestamp:Option, +} + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct Contributor { + pub name: String, + pub email: String, +} \ No newline at end of file