From 5cffcfe457d1b15d201647a5775268378c6018c6 Mon Sep 17 00:00:00 2001 From: HsiangNianian Date: Wed, 21 Jan 2026 10:47:56 +0800 Subject: feat: Add TypeScript support to data structures using ts-rs for type generation --- src-tauri/src/core/game_version.rs | 48 ++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 10 deletions(-) (limited to 'src-tauri/src/core/game_version.rs') diff --git a/src-tauri/src/core/game_version.rs b/src-tauri/src/core/game_version.rs index c62e232..52c7da3 100644 --- a/src-tauri/src/core/game_version.rs +++ b/src-tauri/src/core/game_version.rs @@ -1,8 +1,13 @@ 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)] +#[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 @@ -28,13 +33,18 @@ pub struct GameVersion { pub version_type: Option, } -#[derive(Debug, Deserialize, Serialize, Clone)] +#[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, } -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/DownloadArtifact.ts" +)] pub struct DownloadArtifact { pub sha1: Option, pub size: Option, @@ -42,7 +52,8 @@ pub struct DownloadArtifact { pub path: Option, } -#[derive(Debug, Deserialize, Serialize, Clone)] +#[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, @@ -52,43 +63,60 @@ pub struct AssetIndex { pub total_size: Option, } -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts(export, export_to = "../packages/ui/src/types/generated/Library.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)] +#[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, + #[ts(type = "Record")] pub features: Option, // Feature-based rules (e.g., is_demo_user, has_quick_plays_support) } -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts(export, export_to = "../packages/ui/src/types/generated/OsRule.ts")] pub struct OsRule { pub name: Option, // "linux", "osx", "windows" pub version: Option, // Regex pub arch: Option, // "x86" } -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/LibraryDownloads.ts" +)] pub struct LibraryDownloads { pub artifact: Option, + #[ts(type = "Record")] pub classifiers: Option, // Complex, simplifying for now } -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts(export, export_to = "../packages/ui/src/types/generated/Arguments.ts")] pub struct Arguments { + #[ts(type = "Record")] pub game: Option, + #[ts(type = "Record")] pub jvm: Option, } -#[derive(Debug, Deserialize, Serialize, Clone)] +#[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")] -- cgit v1.2.3-70-g09d2