helixlauncher_meta/
component.rs

1/*
2 * Copyright 2022 kb1000
3 *
4 * This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at https://mozilla.org/MPL/2.0/.
5 */
6
7use crate::util::GradleSpecifier;
8use serde::{Deserialize, Serialize};
9use serde_with::{serde_as, skip_serializing_none, OneOrMany};
10
11#[derive(Deserialize, Serialize, Debug, Clone, Copy, Hash, PartialEq, Eq)]
12#[serde(rename_all = "snake_case")]
13pub enum OsName {
14	Linux,
15	Osx,
16	Windows,
17}
18
19#[derive(Serialize, Deserialize, Debug, Clone)]
20pub struct ComponentDependency {
21	pub id: String,
22	#[serde(skip_serializing_if = "Option::is_none", default)]
23	pub version: Option<String>,
24}
25
26#[derive(Serialize, Deserialize, Debug)]
27pub struct Download {
28	pub name: GradleSpecifier,
29	pub url: String,
30	// these two might have to be made optional
31	pub size: i32,
32	pub sha1: String,
33}
34
35#[derive(Serialize, Deserialize, Debug, Clone, Copy, Hash, PartialEq, Eq)]
36pub enum Trait {
37	MacStartOnFirstThread,
38}
39
40#[derive(Serialize, Deserialize, Debug, Eq, Clone, Copy, Hash, PartialEq)]
41#[serde(rename_all = "snake_case")]
42pub enum Arch {
43	X86,
44	X86_64,
45	Arm64,
46}
47
48#[serde_as]
49#[derive(Serialize, Deserialize, Debug, Clone, Hash, PartialEq, Eq)]
50pub struct Platform {
51	#[serde(skip_serializing_if = "Vec::is_empty", default)]
52	#[serde_as(as = "OneOrMany<_>")]
53	pub os: Vec<OsName>,
54	#[serde(skip_serializing_if = "Option::is_none")]
55	pub arch: Option<Arch>,
56}
57
58#[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq)]
59pub struct Native {
60	pub name: GradleSpecifier,
61	pub platform: Platform,
62	#[serde(skip_serializing_if = "Vec::is_empty", default)]
63	pub exclusions: Vec<String>,
64}
65
66#[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq)]
67#[serde(untagged)]
68pub enum ConditionalClasspathEntry {
69	All(GradleSpecifier),
70	PlatformSpecific {
71		name: GradleSpecifier,
72		platform: Platform,
73	},
74}
75
76#[derive(Serialize, Deserialize, Debug)]
77pub struct Assets {
78	pub id: String,
79	pub url: String,
80	pub sha1: String,
81	pub size: i32,
82	pub total_size: i32, // TODO: is this really necessary?
83}
84
85#[skip_serializing_none]
86#[derive(Serialize, Deserialize, Debug)]
87#[serde(deny_unknown_fields)]
88pub struct Component {
89	pub format_version: i32,
90	pub id: String,
91	pub version: String,
92	#[serde(skip_serializing_if = "Vec::is_empty", default)]
93	pub requires: Vec<ComponentDependency>,
94	#[serde(skip_serializing_if = "Vec::is_empty", default)]
95	pub traits: Vec<Trait>,
96	pub assets: Option<Assets>,
97	#[serde(skip_serializing_if = "Vec::is_empty", default)]
98	pub conflicts: Vec<ComponentDependency>,
99	pub downloads: Vec<Download>,
100	pub game_jar: Option<GradleSpecifier>, // separate from classpath to make injecting jarmods possible
101	pub main_class: Option<String>,
102	pub classpath: Vec<ConditionalClasspathEntry>,
103	#[serde(skip_serializing_if = "Vec::is_empty", default)]
104	pub natives: Vec<Native>,
105}