1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
use serde::{Deserialize, Serialize};
use ts_rs::TS;
/// Represents a Minecraft version JSON, supporting both vanilla and modded (Fabric/Forge) formats.
/// Modded versions use `inheritsFrom` to reference a parent vanilla version.
#[derive(Debug, Deserialize, Serialize, Clone, TS)]
#[ts(
export,
export_to = "../../packages/ui/src/types/generated/GameVersion.ts"
)]
pub struct GameVersion {
pub id: String,
/// Optional for mod loaders that inherit from vanilla
pub downloads: Option<Downloads>,
/// Optional for mod loaders that inherit from vanilla
#[serde(rename = "assetIndex")]
pub asset_index: Option<AssetIndex>,
pub libraries: Vec<Library>,
#[serde(rename = "mainClass")]
pub main_class: String,
#[serde(rename = "minecraftArguments")]
pub minecraft_arguments: Option<String>,
pub arguments: Option<Arguments>,
#[serde(rename = "javaVersion")]
pub java_version: Option<JavaVersion>,
/// For mod loaders: the vanilla version this inherits from
#[serde(rename = "inheritsFrom")]
pub inherits_from: Option<String>,
/// Fabric/Forge may specify a custom assets version
pub assets: Option<String>,
/// Release type (release, snapshot, old_beta, etc.)
#[serde(rename = "type")]
pub version_type: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone, TS)]
#[ts(
export,
export_to = "../../packages/ui/src/types/generated/Downloads.ts"
)]
pub struct Downloads {
pub client: DownloadArtifact,
pub server: Option<DownloadArtifact>,
}
#[derive(Debug, Deserialize, Serialize, Clone, TS)]
#[ts(
export,
export_to = "../../packages/ui/src/types/generated/DownloadArtifact.ts"
)]
pub struct DownloadArtifact {
pub sha1: Option<String>,
pub size: Option<u64>,
pub url: String,
pub path: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone, TS)]
#[ts(
export,
export_to = "../../packages/ui/src/types/generated/AssetIndex.ts"
)]
pub struct AssetIndex {
pub id: String,
pub sha1: String,
pub size: u64,
pub url: String,
#[serde(rename = "totalSize")]
pub total_size: Option<u64>,
}
#[derive(Debug, Deserialize, Serialize, Clone, TS)]
#[ts(export, export_to = "../../packages/ui/src/types/generated/Library.ts")]
pub struct Library {
pub downloads: Option<LibraryDownloads>,
pub name: String,
pub rules: Option<Vec<Rule>>,
#[ts(type = "Record<string, unknown>")]
pub natives: Option<serde_json::Value>,
/// Maven repository URL for mod loader libraries
pub url: Option<String>,
}
#[derive(Debug, Deserialize, Serialize, Clone, TS)]
#[ts(export, export_to = "../../packages/ui/src/types/generated/Rule.ts")]
pub struct Rule {
pub action: String, // "allow" or "disallow"
pub os: Option<OsRule>,
#[ts(type = "Record<string, unknown>")]
pub features: Option<serde_json::Value>, // Feature-based rules (e.g., is_demo_user, has_quick_plays_support)
}
#[derive(Debug, Deserialize, Serialize, Clone, TS)]
#[ts(export, export_to = "../../packages/ui/src/types/generated/OsRule.ts")]
pub struct OsRule {
pub name: Option<String>, // "linux", "osx", "windows"
pub version: Option<String>, // Regex
pub arch: Option<String>, // "x86"
}
#[derive(Debug, Deserialize, Serialize, Clone, TS)]
#[ts(
export,
export_to = "../../packages/ui/src/types/generated/LibraryDownloads.ts"
)]
pub struct LibraryDownloads {
pub artifact: Option<DownloadArtifact>,
#[ts(type = "Record<string, unknown>")]
pub classifiers: Option<serde_json::Value>, // Complex, simplifying for now
}
#[derive(Debug, Deserialize, Serialize, Clone, TS)]
#[ts(
export,
export_to = "../../packages/ui/src/types/generated/Arguments.ts"
)]
pub struct Arguments {
#[ts(type = "Record<string, unknown>")]
pub game: Option<serde_json::Value>,
#[ts(type = "Record<string, unknown>")]
pub jvm: Option<serde_json::Value>,
}
#[derive(Debug, Deserialize, Serialize, Clone, TS)]
#[ts(
export,
export_to = "../../packages/ui/src/types/generated/JavaVersion.ts"
)]
pub struct JavaVersion {
pub component: String,
#[serde(rename = "majorVersion")]
pub major_version: u64,
}
|