chore: add package bindings
This commit is contained in:
parent
d98a3aedcf
commit
2593b293de
4 changed files with 48 additions and 9 deletions
|
|
@ -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<Paginated<ManagedPackage>>;
|
||||
async fn get(&self, slug: &str) -> LauncherResult<ManagedPackage>;
|
||||
|
|
@ -42,7 +42,7 @@ pub trait ProviderExt {
|
|||
async fn get_versions(&self, slugs: &[String]) -> LauncherResult<Vec<ManagedVersion>>;
|
||||
}
|
||||
|
||||
#[async_trait::async_trait(?Send)]
|
||||
#[async_trait::async_trait]
|
||||
impl ProviderExt for Provider {
|
||||
async fn search(&self, query: &SearchQuery) -> LauncherResult<Paginated<ManagedPackage>> {
|
||||
match self {
|
||||
|
|
|
|||
|
|
@ -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<Paginated<ManagedPackage>> {
|
||||
let mut url = Url::parse(url!("/search"))?;
|
||||
|
|
|
|||
|
|
@ -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<ManagedUser>;
|
||||
|
||||
#[taurpc(alias = "downloadPackage")]
|
||||
async fn download_package(provider: Provider, package_id: String, version_id: String, cluster_id: ClusterId, skip_compatibility: Option<bool>) -> LauncherResult<packages::Model>;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -387,4 +390,40 @@ impl TauriLauncherApi for TauriLauncherApiImpl {
|
|||
}
|
||||
|
||||
// Packages
|
||||
async fn search_packages(self, provider: Provider, query: SearchQuery) -> LauncherResult<Paginated<ManagedPackage>> {
|
||||
Ok(provider.search(&query).await?)
|
||||
}
|
||||
|
||||
async fn get_package(self, provider: Provider, slug: String) -> LauncherResult<ManagedPackage> {
|
||||
Ok(provider.get(&slug).await?)
|
||||
}
|
||||
|
||||
async fn get_multiple_packages(self, provider: Provider, slugs: Vec<String>) -> LauncherResult<Vec<ManagedPackage>> {
|
||||
Ok(provider.get_multiple(&slugs).await?)
|
||||
}
|
||||
|
||||
async fn get_package_versions(self, provider: Provider, slug: String, mc_versions: Option<Vec<String>>, loaders: Option<Vec<GameLoader>>, offset: usize, limit: usize) -> LauncherResult<Paginated<ManagedVersion>> {
|
||||
Ok(provider.get_versions_paginated(&slug, mc_versions, loaders, offset, limit).await?)
|
||||
}
|
||||
|
||||
async fn get_package_user(self, provider: Provider, slug: String) -> LauncherResult<ManagedUser> {
|
||||
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<bool>) -> LauncherResult<packages::Model> {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<T>
|
||||
where T: Clone + Serialize {
|
||||
where T: Clone + Serialize + Send {
|
||||
pub total: usize,
|
||||
pub offset: usize,
|
||||
pub limit: usize,
|
||||
pub items: Vec<T>,
|
||||
}
|
||||
|
||||
impl<T: Clone + Serialize> Debug for Paginated<T> {
|
||||
impl<T: Clone + Serialize + Send> Debug for Paginated<T> {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
f.debug_struct("Paginated")
|
||||
.field("total", &self.total)
|
||||
|
|
@ -23,7 +23,7 @@ impl<T: Clone + Serialize> Debug for Paginated<T> {
|
|||
}
|
||||
}
|
||||
|
||||
impl <T: Clone + Serialize> Paginated<T> {
|
||||
impl <T: Clone + Serialize + Send> Paginated<T> {
|
||||
#[must_use]
|
||||
pub const fn new(total: usize, offset: usize, limit: usize, items: Vec<T>) -> Self {
|
||||
Self { total, offset, limit, items }
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue