Progress on downloads. Currently working on parsing functions to be run asynchronously

This commit is contained in:
quexeky
2024-10-18 07:45:09 +11:00
parent 3923acf780
commit 496c6a57e3
7 changed files with 89 additions and 0 deletions

13
src-tauri/Cargo.lock generated
View File

@ -1037,6 +1037,7 @@ dependencies = [
"tauri-plugin-dialog", "tauri-plugin-dialog",
"tauri-plugin-shell", "tauri-plugin-shell",
"tauri-plugin-single-instance", "tauri-plugin-single-instance",
"tokio",
"url", "url",
"uuid", "uuid",
"webbrowser", "webbrowser",
@ -4500,10 +4501,22 @@ dependencies = [
"pin-project-lite", "pin-project-lite",
"signal-hook-registry", "signal-hook-registry",
"socket2", "socket2",
"tokio-macros",
"tracing", "tracing",
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
[[package]]
name = "tokio-macros"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.79",
]
[[package]] [[package]]
name = "tokio-native-tls" name = "tokio-native-tls"
version = "0.3.1" version = "0.3.1"

View File

@ -37,6 +37,7 @@ hex = "0.4.3"
tauri-plugin-dialog = "2" tauri-plugin-dialog = "2"
env_logger = "0.11.5" env_logger = "0.11.5"
http = "1.1.0" http = "1.1.0"
tokio = { version = "1.40.0", features = ["rt", "tokio-macros"] }
[dependencies.uuid] [dependencies.uuid]
version = "1.10.0" version = "1.10.0"

View File

@ -0,0 +1,22 @@
/* GENERAL OUTLINE
When downloading any game, the following details must be provided to the server:
- Game ID
- User token
- TBC
The steps to then download a game are as follows:
1. User requests
*/
use tauri::AppHandle;
use crate::auth::generate_authorization_header;
use crate::DB;
use crate::db::DatabaseImpls;
use crate::downloads::manifest::Manifest;
#[tauri::command]
fn download_game(app: AppHandle, game_id: String) -> Result<String, String>{
todo!()
}

View File

@ -0,0 +1,3 @@
pub(crate) struct Manifest {
}

View File

@ -0,0 +1,2 @@
mod downloads;
mod manifest;

View File

@ -3,6 +3,8 @@ mod db;
mod library; mod library;
mod remote; mod remote;
mod unpacker; mod unpacker;
mod downloads;
mod utils;
use auth::{auth_initiate, generate_authorization_header, recieve_handshake}; use auth::{auth_initiate, generate_authorization_header, recieve_handshake};
use db::{DatabaseInterface, DATA_ROOT_DIR}; use db::{DatabaseInterface, DATA_ROOT_DIR};
@ -101,6 +103,8 @@ pub fn run() {
// Library // Library
fetch_library, fetch_library,
fetch_game, fetch_game,
// Downloads
download_game
]) ])
.plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_shell::init())
.setup(|app| { .setup(|app| {

44
src-tauri/src/utils.rs Normal file
View File

@ -0,0 +1,44 @@
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::atomic::Ordering::Relaxed;
use crate::utils::ProgressChecker::Complete;
#[derive(Eq, PartialEq)]
pub enum ProgressChecker {
Complete,
Incomplete
}
// This function is designed to take in any function which does not regularly return a value,
// and instead loops over it until it returns "Complete". The current number of iterations
// is counted by "progress"
pub async fn progress_updater(function: Box<dyn Fn() -> ProgressChecker>, progress: AtomicUsize) {
loop {
if function() == ProgressChecker::Complete { break }
progress.fetch_add(1, Relaxed);
}
}
pub async fn threaded_progress_updater<F>(f: F, progress: AtomicUsize, max_threads: usize, instances: usize) -> ProgressChecker
where F: Fn() -> ProgressChecker + Send + Clone + Copy + 'static
{
let mut threads = Vec::new();
for instance in 0..instances {
let func = tokio::spawn(async move {
let res = f();
return res
});
threads.push(func);
}
let mut completed = ProgressChecker::Incomplete;
for thread in threads {
if thread.await.unwrap() == Complete {
completed = Complete
}
progress.fetch_add(1, Ordering::Relaxed);
}
completed
}
fn test() -> ProgressChecker {
ProgressChecker::Incomplete
}