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 = "game-version.ts")] pub struct GameVersion { pub id: String, /// Optional for mod loaders that inherit from vanilla pub downloads: Option, /// Optional for mod loaders that inherit from vanilla #[serde(rename = "assetIndex")] pub asset_index: Option, pub libraries: Vec, #[serde(rename = "mainClass")] pub main_class: String, #[serde(rename = "minecraftArguments")] pub minecraft_arguments: Option, pub arguments: Option, #[serde(rename = "javaVersion")] pub java_version: Option, /// For mod loaders: the vanilla version this inherits from #[serde(rename = "inheritsFrom")] pub inherits_from: Option, /// Fabric/Forge may specify a custom assets version pub assets: Option, /// Release type (release, snapshot, old_beta, etc.) #[serde(rename = "type")] pub version_type: Option, } #[derive(Debug, Deserialize, Serialize, Clone, TS)] #[ts(export, export_to = "game-version.ts")] pub struct Downloads { pub client: DownloadArtifact, pub server: Option, } #[derive(Debug, Deserialize, Serialize, Clone, TS)] #[ts(export, export_to = "game-version.ts")] pub struct DownloadArtifact { pub sha1: Option, pub size: Option, pub url: String, pub path: Option, } #[derive(Debug, Deserialize, Serialize, Clone, TS)] #[ts(export, export_to = "game-version.ts")] pub struct AssetIndex { pub id: String, pub sha1: String, pub size: u64, pub url: String, #[serde(rename = "totalSize")] pub total_size: Option, } #[derive(Debug, Deserialize, Serialize, Clone, TS)] #[ts(export, export_to = "game-version.ts")] pub struct Library { pub downloads: Option, pub name: String, pub rules: Option>, #[ts(type = "Record")] pub natives: Option, /// Maven repository URL for mod loader libraries pub url: Option, } #[derive(Debug, Deserialize, Serialize, Clone, TS)] #[ts(export, export_to = "game-version.ts")] pub struct Rule { pub action: String, // "allow" or "disallow" pub os: Option, #[ts(type = "Record")] pub features: Option, // Feature-based rules (e.g., is_demo_user, has_quick_plays_support) } #[derive(Debug, Deserialize, Serialize, Clone, TS)] #[ts(export, export_to = "game-version.ts")] pub struct OsRule { pub name: Option, // "linux", "osx", "windows" pub version: Option, // Regex pub arch: Option, // "x86" } #[derive(Debug, Deserialize, Serialize, Clone, TS)] #[ts(export, export_to = "game-version.ts")] pub struct LibraryDownloads { pub artifact: Option, #[ts(type = "Record")] pub classifiers: Option, // Complex, simplifying for now } #[derive(Debug, Deserialize, Serialize, Clone, TS)] #[ts(export, export_to = "game-version.ts")] pub struct Arguments { #[ts(type = "Record")] pub game: Option, #[ts(type = "Record")] pub jvm: Option, } #[derive(Debug, Deserialize, Serialize, Clone, TS)] #[ts(export, export_to = "game-version.ts")] pub struct JavaVersion { pub component: String, #[serde(rename = "majorVersion")] pub major_version: u64, }