diff options
| author | 2026-01-21 10:47:56 +0800 | |
|---|---|---|
| committer | 2026-01-21 10:47:56 +0800 | |
| commit | 5cffcfe457d1b15d201647a5775268378c6018c6 (patch) | |
| tree | 562160c25373acc968c7c7abafaf018cd1a21261 /src-tauri/src | |
| parent | b27f30bfbdd05a53caaf6fe63fd9354b3689623c (diff) | |
| download | DropOut-5cffcfe457d1b15d201647a5775268378c6018c6.tar.gz DropOut-5cffcfe457d1b15d201647a5775268378c6018c6.zip | |
feat: Add TypeScript support to data structures using ts-rs for type generation
Diffstat (limited to 'src-tauri/src')
| -rw-r--r-- | src-tauri/src/core/assistant.rs | 19 | ||||
| -rw-r--r-- | src-tauri/src/core/auth.rs | 42 | ||||
| -rw-r--r-- | src-tauri/src/core/config.rs | 19 | ||||
| -rw-r--r-- | src-tauri/src/core/downloader.rs | 43 | ||||
| -rw-r--r-- | src-tauri/src/core/fabric.rs | 55 | ||||
| -rw-r--r-- | src-tauri/src/core/forge.rs | 14 | ||||
| -rw-r--r-- | src-tauri/src/core/game_version.rs | 48 | ||||
| -rw-r--r-- | src-tauri/src/core/instance.rs | 16 | ||||
| -rw-r--r-- | src-tauri/src/core/java.rs | 32 | ||||
| -rw-r--r-- | src-tauri/src/core/manifest.rs | 13 | ||||
| -rw-r--r-- | src-tauri/src/main.rs | 36 |
11 files changed, 276 insertions, 61 deletions
diff --git a/src-tauri/src/core/assistant.rs b/src-tauri/src/core/assistant.rs index 9a8f7bf..987dc41 100644 --- a/src-tauri/src/core/assistant.rs +++ b/src-tauri/src/core/assistant.rs @@ -4,8 +4,10 @@ use serde::{Deserialize, Serialize}; use std::collections::VecDeque; use std::sync::{Arc, Mutex}; use tauri::{Emitter, Window}; +use ts_rs::TS; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export, export_to = "../packages/ui/src/types/generated/Message.ts")] pub struct Message { pub role: String, pub content: String, @@ -51,7 +53,8 @@ pub struct OllamaTagsResponse { } // Simplified model info for frontend -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export, export_to = "../packages/ui/src/types/generated/ModelInfo.ts")] pub struct ModelInfo { pub id: String, pub name: String, @@ -102,7 +105,11 @@ pub struct OpenAIModelsResponse { } // Streaming response structures -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/GenerationStats.ts" +)] pub struct GenerationStats { pub total_duration: u64, pub load_duration: u64, @@ -112,7 +119,11 @@ pub struct GenerationStats { pub eval_duration: u64, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/StreamChunk.ts" +)] pub struct StreamChunk { pub content: String, pub done: bool, diff --git a/src-tauri/src/core/auth.rs b/src-tauri/src/core/auth.rs index d5e6c17..62f8c69 100644 --- a/src-tauri/src/core/auth.rs +++ b/src-tauri/src/core/auth.rs @@ -1,5 +1,6 @@ use serde::{Deserialize, Serialize}; use std::sync::Mutex; +use ts_rs::TS; use uuid::Uuid; // Helper to create a client with a custom User-Agent @@ -11,8 +12,13 @@ fn get_client() -> reqwest::Client { .unwrap_or_else(|_| reqwest::Client::new()) } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] #[serde(tag = "type")] +#[ts( + export, + tag = "type", + export_to = "../packages/ui/src/types/generated/Account.ts" +)] pub enum Account { Offline(OfflineAccount), Microsoft(MicrosoftAccount), @@ -41,13 +47,21 @@ impl Account { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/OfflineAccount.ts" +)] pub struct OfflineAccount { pub username: String, pub uuid: String, } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/MicrosoftAccount.ts" +)] pub struct MicrosoftAccount { pub username: String, pub uuid: String, @@ -73,11 +87,15 @@ pub fn generate_offline_uuid(username: &str) -> String { Uuid::new_v3(&namespace, username.as_bytes()).to_string() } -// const CLIENT_ID: &str = "fe165602-5410-4441-92f7-326e10a7cb82"; -const CLIENT_ID: &str = "c36a9fb6-4f2a-41ff-90bd-ae7cc92031eb"; // ATLauncher's Client ID +const CLIENT_ID: &str = "fe165602-5410-4441-92f7-326e10a7cb82"; +// const CLIENT_ID: &str = "c36a9fb6-4f2a-41ff-90bd-ae7cc92031eb"; // ATLauncher's Client ID const SCOPE: &str = "XboxLive.SignIn XboxLive.offline_access"; -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/DeviceCodeResponse.ts" +)] pub struct DeviceCodeResponse { pub user_code: String, pub device_code: String, @@ -87,7 +105,11 @@ pub struct DeviceCodeResponse { pub message: Option<String>, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/TokenResponse.ts" +)] pub struct TokenResponse { pub access_token: String, pub refresh_token: Option<String>, @@ -209,7 +231,11 @@ pub struct MinecraftAuthResponse { pub expires_in: u64, } -#[derive(Debug, Serialize, Deserialize)] +#[derive(Debug, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/MinecraftProfile.ts" +)] pub struct MinecraftProfile { pub id: String, pub name: String, diff --git a/src-tauri/src/core/config.rs b/src-tauri/src/core/config.rs index e4b9381..b31e0ce 100644 --- a/src-tauri/src/core/config.rs +++ b/src-tauri/src/core/config.rs @@ -3,8 +3,13 @@ use std::fs; use std::path::PathBuf; use std::sync::Mutex; use tauri::{AppHandle, Manager}; +use ts_rs::TS; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/AssistantConfig.ts" +)] #[serde(default)] pub struct AssistantConfig { pub enabled: bool, @@ -43,7 +48,11 @@ impl Default for AssistantConfig { } /// Feature-gated arguments configuration -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/FeatureFlags.ts" +)] #[serde(default)] pub struct FeatureFlags { /// Demo user: enables demo-related arguments when rules require it @@ -70,7 +79,11 @@ impl Default for FeatureFlags { } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/LauncherConfig.ts" +)] #[serde(default)] pub struct LauncherConfig { pub min_memory: u32, // in MB diff --git a/src-tauri/src/core/downloader.rs b/src-tauri/src/core/downloader.rs index 26f6ebd..0a3590e 100644 --- a/src-tauri/src/core/downloader.rs +++ b/src-tauri/src/core/downloader.rs @@ -7,8 +7,13 @@ use std::sync::Arc; use tauri::{AppHandle, Emitter, Manager, Window}; use tokio::io::{AsyncSeekExt, AsyncWriteExt}; use tokio::sync::Semaphore; +use ts_rs::TS; -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/DownloadTask.ts" +)] pub struct DownloadTask { pub url: String, pub path: PathBuf, @@ -19,7 +24,11 @@ pub struct DownloadTask { } /// Metadata for resumable downloads stored in .part.meta file -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/DownloadMetadata.ts" +)] pub struct DownloadMetadata { pub url: String, pub file_name: String, @@ -31,7 +40,11 @@ pub struct DownloadMetadata { } /// A download segment for multi-segment parallel downloading -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/DownloadSegment.ts" +)] pub struct DownloadSegment { pub start: u64, pub end: u64, @@ -40,7 +53,11 @@ pub struct DownloadSegment { } /// Progress event for Java download -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/JavaDownloadProgress.ts" +)] pub struct JavaDownloadProgress { pub file_name: String, pub downloaded_bytes: u64, @@ -52,7 +69,11 @@ pub struct JavaDownloadProgress { } /// Pending download task for queue persistence -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/PendingJavaDownload.ts" +)] pub struct PendingJavaDownload { pub major_version: u32, pub image_type: String, @@ -65,7 +86,11 @@ pub struct PendingJavaDownload { } /// Download queue for persistence -#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, Serialize, Deserialize, Default, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/DownloadQueue.ts" +)] pub struct DownloadQueue { pub pending_downloads: Vec<PendingJavaDownload>, } @@ -419,7 +444,11 @@ fn create_new_metadata( } } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/ProgressEvent.ts" +)] pub struct ProgressEvent { pub file: String, pub downloaded: u64, diff --git a/src-tauri/src/core/fabric.rs b/src-tauri/src/core/fabric.rs index 32790c7..feadd6b 100644 --- a/src-tauri/src/core/fabric.rs +++ b/src-tauri/src/core/fabric.rs @@ -8,11 +8,16 @@ use serde::{Deserialize, Serialize}; use std::error::Error; use std::path::PathBuf; +use ts_rs::TS; const FABRIC_META_URL: &str = "https://meta.fabricmc.net/v2"; /// Represents a Fabric loader version from the Meta API. -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/FabricLoaderVersion.ts" +)] pub struct FabricLoaderVersion { pub separator: String, pub build: i32, @@ -22,7 +27,11 @@ pub struct FabricLoaderVersion { } /// Represents a Fabric intermediary mapping version. -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/FabricIntermediaryVersion.ts" +)] pub struct FabricIntermediaryVersion { pub maven: String, pub version: String, @@ -30,7 +39,11 @@ pub struct FabricIntermediaryVersion { } /// Represents a combined loader + intermediary version entry. -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/FabricLoaderEntry.ts" +)] pub struct FabricLoaderEntry { pub loader: FabricLoaderVersion, pub intermediary: FabricIntermediaryVersion, @@ -39,7 +52,11 @@ pub struct FabricLoaderEntry { } /// Launcher metadata from Fabric Meta API. -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/FabricLauncherMeta.ts" +)] pub struct FabricLauncherMeta { pub version: i32, pub libraries: FabricLibraries, @@ -48,7 +65,11 @@ pub struct FabricLauncherMeta { } /// Libraries required by Fabric loader. -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/FabricLibraries.ts" +)] pub struct FabricLibraries { pub client: Vec<FabricLibrary>, pub common: Vec<FabricLibrary>, @@ -56,7 +77,11 @@ pub struct FabricLibraries { } /// A single Fabric library dependency. -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/FabricLibrary.ts" +)] pub struct FabricLibrary { pub name: String, pub url: Option<String>, @@ -64,7 +89,11 @@ pub struct FabricLibrary { /// Main class configuration for Fabric. /// Can be either a struct with client/server fields or a simple string. -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/FabricMainClass.ts" +)] #[serde(untagged)] pub enum FabricMainClass { Structured { client: String, server: String }, @@ -89,14 +118,22 @@ impl FabricMainClass { } /// Represents a Minecraft version supported by Fabric. -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/FabricGameVersion.ts" +)] pub struct FabricGameVersion { pub version: String, pub stable: bool, } /// Information about an installed Fabric version. -#[derive(Debug, Serialize, Clone)] +#[derive(Debug, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/InstalledFabricVersion.ts" +)] pub struct InstalledFabricVersion { pub id: String, pub minecraft_version: String, diff --git a/src-tauri/src/core/forge.rs b/src-tauri/src/core/forge.rs index 65bf413..a256add 100644 --- a/src-tauri/src/core/forge.rs +++ b/src-tauri/src/core/forge.rs @@ -12,6 +12,7 @@ use std::error::Error; #[cfg(target_os = "windows")] use std::os::windows::process::CommandExt; use std::path::PathBuf; +use ts_rs::TS; const FORGE_PROMOTIONS_URL: &str = "https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json"; @@ -19,7 +20,11 @@ const FORGE_MAVEN_URL: &str = "https://maven.minecraftforge.net/"; const FORGE_FILES_URL: &str = "https://files.minecraftforge.net/"; /// Represents a Forge version entry. -#[derive(Debug, Deserialize, Serialize, Clone)] +#[derive(Debug, Deserialize, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/ForgeVersion.ts" +)] pub struct ForgeVersion { pub version: String, pub minecraft_version: String, @@ -36,11 +41,16 @@ struct ForgePromotions { } /// Information about an installed Forge version. -#[derive(Debug, Serialize, Clone)] +#[derive(Debug, Serialize, Clone, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/InstalledForgeVersion.ts" +)] pub struct InstalledForgeVersion { pub id: String, pub minecraft_version: String, pub forge_version: String, + #[ts(type = "string")] pub path: PathBuf, } 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<String>, } -#[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<DownloadArtifact>, } -#[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<String>, pub size: Option<u64>, @@ -42,7 +52,8 @@ pub struct DownloadArtifact { pub path: Option<String>, } -#[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<u64>, } -#[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<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)] +#[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)] +#[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)] +#[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)] +#[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)] +#[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")] diff --git a/src-tauri/src/core/instance.rs b/src-tauri/src/core/instance.rs index 573273e..a281968 100644 --- a/src-tauri/src/core/instance.rs +++ b/src-tauri/src/core/instance.rs @@ -11,9 +11,11 @@ use std::fs; use std::path::{Path, PathBuf}; use std::sync::Mutex; use tauri::{AppHandle, Manager}; +use ts_rs::TS; /// Represents a game instance/profile -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export, export_to = "../packages/ui/src/types/generated/Instance.ts")] pub struct Instance { pub id: String, // 唯一标识符(UUID) pub name: String, // 显示名称 @@ -31,14 +33,22 @@ pub struct Instance { } /// Memory settings override for an instance -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/MemoryOverride.ts" +)] pub struct MemoryOverride { pub min: u32, // MB pub max: u32, // MB } /// Configuration for all instances -#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, Serialize, Deserialize, Default, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/InstanceConfig.ts" +)] pub struct InstanceConfig { pub instances: Vec<Instance>, pub active_instance_id: Option<String>, // 当前活动的实例ID diff --git a/src-tauri/src/core/java.rs b/src-tauri/src/core/java.rs index 2e3c8a7..245c496 100644 --- a/src-tauri/src/core/java.rs +++ b/src-tauri/src/core/java.rs @@ -6,6 +6,7 @@ use std::process::Command; use tauri::AppHandle; use tauri::Emitter; use tauri::Manager; +use ts_rs::TS; use crate::core::downloader::{self, DownloadQueue, JavaDownloadProgress, PendingJavaDownload}; use crate::utils::zip; @@ -25,7 +26,11 @@ fn strip_unc_prefix(path: PathBuf) -> PathBuf { path } -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/JavaInstallation.ts" +)] pub struct JavaInstallation { pub path: String, pub version: String, @@ -33,7 +38,12 @@ pub struct JavaInstallation { } /// Java image type: JRE or JDK -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, TS)] +#[ts( + export, + rename_all = "lowercase", + export_to = "../packages/ui/src/types/generated/ImageType.ts" +)] #[serde(rename_all = "lowercase")] pub enum ImageType { Jre, @@ -56,7 +66,11 @@ impl std::fmt::Display for ImageType { } /// Java release information for UI display -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/JavaReleaseInfo.ts" +)] pub struct JavaReleaseInfo { pub major_version: u32, pub image_type: String, @@ -72,7 +86,11 @@ pub struct JavaReleaseInfo { } /// Java catalog containing all available versions -#[derive(Debug, Clone, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, Serialize, Deserialize, Default, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/JavaCatalog.ts" +)] pub struct JavaCatalog { pub releases: Vec<JavaReleaseInfo>, pub available_major_versions: Vec<u32>, @@ -128,7 +146,11 @@ pub struct AvailableReleases { } /// Java download information from Adoptium -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/JavaDownloadInfo.ts" +)] pub struct JavaDownloadInfo { pub version: String, pub release_name: String, diff --git a/src-tauri/src/core/manifest.rs b/src-tauri/src/core/manifest.rs index e792071..5382259 100644 --- a/src-tauri/src/core/manifest.rs +++ b/src-tauri/src/core/manifest.rs @@ -3,20 +3,27 @@ use std::error::Error; use std::path::PathBuf; use crate::core::game_version::GameVersion; +use ts_rs::TS; -#[derive(Debug, Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/VersionManifest.ts" +)] pub struct VersionManifest { pub latest: Latest, pub versions: Vec<Version>, } -#[derive(Debug, Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize, TS)] +#[ts(export, export_to = "../packages/ui/src/types/generated/Latest.ts")] pub struct Latest { pub release: String, pub snapshot: String, } -#[derive(Debug, Deserialize, Serialize)] +#[derive(Debug, Deserialize, Serialize, TS)] +#[ts(export, export_to = "../packages/ui/src/types/generated/Version.ts")] pub struct Version { pub id: String, #[serde(rename = "type")] diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 0f1d7a1..e9a24fb 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -6,7 +6,8 @@ use std::process::Stdio; use std::sync::Mutex; use tauri::{Emitter, Manager, State, Window}; // Added Emitter use tokio::io::{AsyncBufReadExt, BufReader}; -use tokio::process::Command; // Added Serialize +use tokio::process::Command; +use ts_rs::TS; // Added Serialize #[cfg(target_os = "windows")] use std::os::windows::process::CommandExt; @@ -1749,7 +1750,11 @@ async fn get_version_java_version( } /// Version metadata for display in the UI -#[derive(serde::Serialize)] +#[derive(serde::Serialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/VersionMetadata.ts" +)] struct VersionMetadata { id: String, #[serde(rename = "javaVersion")] @@ -1899,7 +1904,11 @@ async fn get_version_metadata( } /// Installed version info -#[derive(serde::Serialize)] +#[derive(serde::Serialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/InstalledVersion.ts" +)] struct InstalledVersion { id: String, #[serde(rename = "type")] @@ -2128,7 +2137,11 @@ async fn install_forge( Ok(result) } -#[derive(serde::Serialize)] +#[derive(serde::Serialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/GithubRelease.ts" +)] struct GithubRelease { tag_name: String, name: String, @@ -2174,7 +2187,11 @@ async fn get_github_releases() -> Result<Vec<GithubRelease>, String> { Ok(result) } -#[derive(Serialize)] +#[derive(Serialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/PastebinResponse.ts" +)] struct PastebinResponse { url: String, } @@ -2382,7 +2399,11 @@ async fn assistant_chat_stream( } /// Migrate instance caches to shared global caches -#[derive(Serialize)] +#[derive(Serialize, TS)] +#[ts( + export, + export_to = "../packages/ui/src/types/generated/MigrationResult.ts" +)] struct MigrationResult { moved_files: usize, hardlinks: usize, @@ -2431,7 +2452,8 @@ async fn migrate_shared_caches( } /// File information for instance file browser -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, TS)] +#[ts(export, export_to = "../packages/ui/src/types/generated/FileInfo.ts")] struct FileInfo { name: String, path: String, |