From 2593b293de819d47445f1beea13fc5a91cda7272 Mon Sep 17 00:00:00 2001 From: emirsassan Date: Tue, 15 Jul 2025 21:34:23 +0300 Subject: [PATCH] chore: add package bindings --- .../core/src/api/packages/provider/mod.rs | 4 +- .../src/api/packages/provider/modrinth.rs | 2 +- packages/core/src/api/tauri/commands.rs | 43 ++++++++++++++++++- packages/core/src/utils/pagination.rs | 8 ++-- 4 files changed, 48 insertions(+), 9 deletions(-) diff --git a/packages/core/src/api/packages/provider/mod.rs b/packages/core/src/api/packages/provider/mod.rs index fdd99058..b7e8646a 100644 --- a/packages/core/src/api/packages/provider/mod.rs +++ b/packages/core/src/api/packages/provider/mod.rs @@ -10,7 +10,7 @@ mod modrinth; pub use modrinth::ModrinthProviderImpl; -#[async_trait::async_trait(?Send)] +#[async_trait::async_trait] pub trait ProviderExt { async fn search(&self, query: &SearchQuery) -> LauncherResult>; async fn get(&self, slug: &str) -> LauncherResult; @@ -42,7 +42,7 @@ pub trait ProviderExt { async fn get_versions(&self, slugs: &[String]) -> LauncherResult>; } -#[async_trait::async_trait(?Send)] +#[async_trait::async_trait] impl ProviderExt for Provider { async fn search(&self, query: &SearchQuery) -> LauncherResult> { match self { diff --git a/packages/core/src/api/packages/provider/modrinth.rs b/packages/core/src/api/packages/provider/modrinth.rs index 3e1468fc..0a5946a2 100644 --- a/packages/core/src/api/packages/provider/modrinth.rs +++ b/packages/core/src/api/packages/provider/modrinth.rs @@ -37,7 +37,7 @@ impl ModrinthProviderImpl { } } -#[async_trait::async_trait(?Send)] +#[async_trait::async_trait] impl ProviderExt for ModrinthProviderImpl { async fn search(&self, query: &SearchQuery) -> LauncherResult> { let mut url = Url::parse(url!("/search"))?; diff --git a/packages/core/src/api/tauri/commands.rs b/packages/core/src/api/tauri/commands.rs index d7149bf5..348b8f54 100644 --- a/packages/core/src/api/tauri/commands.rs +++ b/packages/core/src/api/tauri/commands.rs @@ -1,8 +1,8 @@ use interpulse::api::minecraft::Version; -use onelauncher_entity::{clusters, icon::Icon, loader::GameLoader, package::Provider, prelude::entity, resolution::Resolution}; +use onelauncher_entity::{clusters, icon::Icon, loader::GameLoader, package::Provider, packages, prelude::entity, resolution::Resolution}; use sea_orm::ActiveValue::Set; use serde::Serialize; -use crate::{api::packages::data::{ManagedPackage, ManagedUser, ManagedVersion, SearchQuery}, store::{Settings, State}, utils::pagination::Paginated}; +use crate::{api::packages::{data::{ManagedPackage, ManagedUser, ManagedVersion, SearchQuery}, provider::ProviderExt}, store::{Settings, State}, utils::pagination::Paginated}; use tauri::{AppHandle, Runtime}; use crate::{api::{self, cluster::dao::ClusterId}, error::{LauncherError, LauncherResult}, store::{credentials::MinecraftCredentials, Core}}; @@ -97,6 +97,9 @@ pub trait TauriLauncherApi { #[taurpc(alias = "getPackageUser")] async fn get_package_user(provider: Provider, slug: String) -> LauncherResult; + + #[taurpc(alias = "downloadPackage")] + async fn download_package(provider: Provider, package_id: String, version_id: String, cluster_id: ClusterId, skip_compatibility: Option) -> LauncherResult; } @@ -387,4 +390,40 @@ impl TauriLauncherApi for TauriLauncherApiImpl { } // Packages + async fn search_packages(self, provider: Provider, query: SearchQuery) -> LauncherResult> { + Ok(provider.search(&query).await?) + } + + async fn get_package(self, provider: Provider, slug: String) -> LauncherResult { + Ok(provider.get(&slug).await?) + } + + async fn get_multiple_packages(self, provider: Provider, slugs: Vec) -> LauncherResult> { + Ok(provider.get_multiple(&slugs).await?) + } + + async fn get_package_versions(self, provider: Provider, slug: String, mc_versions: Option>, loaders: Option>, offset: usize, limit: usize) -> LauncherResult> { + Ok(provider.get_versions_paginated(&slug, mc_versions, loaders, offset, limit).await?) + } + + async fn get_package_user(self, provider: Provider, slug: String) -> LauncherResult { + Ok(provider.get_user(&slug).await?) + } + + async fn download_package(self, provider: Provider, package_id: String, version_id: String, cluster_id: ClusterId, skip_compatibility: Option) -> LauncherResult { + let cluster = api::cluster::dao::get_cluster_by_id(cluster_id).await? + .ok_or_else(|| anyhow::anyhow!("cluster with id {} not found", cluster_id))?; + + let package = provider.get(&package_id).await?; + + let versions = provider.get_versions(&[version_id]).await?; + let version = versions.into_iter().next() + .ok_or_else(|| anyhow::anyhow!("Version not found"))?; + + let model = api::packages::download_package(&package, &version, None).await?; + + api::packages::link_package(&model, &cluster, skip_compatibility).await?; + + Ok(model) + } } diff --git a/packages/core/src/utils/pagination.rs b/packages/core/src/utils/pagination.rs index 77c039e5..e9b9d44c 100644 --- a/packages/core/src/utils/pagination.rs +++ b/packages/core/src/utils/pagination.rs @@ -1,18 +1,18 @@ use std::fmt::Debug; - +use std::marker::Send; use serde::{Deserialize, Serialize}; #[onelauncher_macro::specta] #[derive(Clone, Serialize, Deserialize)] pub struct Paginated -where T: Clone + Serialize { +where T: Clone + Serialize + Send { pub total: usize, pub offset: usize, pub limit: usize, pub items: Vec, } -impl Debug for Paginated { +impl Debug for Paginated { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Paginated") .field("total", &self.total) @@ -23,7 +23,7 @@ impl Debug for Paginated { } } -impl Paginated { +impl Paginated { #[must_use] pub const fn new(total: usize, offset: usize, limit: usize, items: Vec) -> Self { Self { total, offset, limit, items }