1use 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 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, }
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>, 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}