aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src-tauri/src
diff options
context:
space:
mode:
Diffstat (limited to 'src-tauri/src')
-rw-r--r--src-tauri/src/core/assistant.rs19
-rw-r--r--src-tauri/src/core/auth.rs42
-rw-r--r--src-tauri/src/core/config.rs19
-rw-r--r--src-tauri/src/core/downloader.rs43
-rw-r--r--src-tauri/src/core/fabric.rs55
-rw-r--r--src-tauri/src/core/forge.rs14
-rw-r--r--src-tauri/src/core/game_version.rs48
-rw-r--r--src-tauri/src/core/instance.rs16
-rw-r--r--src-tauri/src/core/java.rs32
-rw-r--r--src-tauri/src/core/manifest.rs13
-rw-r--r--src-tauri/src/main.rs36
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,