2023-08-04 20:33:50 -07:00
use serde ::{ Deserialize , Serialize } ;
2023-09-12 09:27:03 -07:00
use theseus ::{
handler ,
prelude ::{ CommandPayload , DirectoryInfo } ,
} ;
2023-06-30 08:11:32 -07:00
2023-06-02 07:09:46 -07:00
use crate ::api ::Result ;
2024-08-16 23:20:11 -07:00
use dashmap ::DashMap ;
use std ::path ::PathBuf ;
2023-06-02 07:09:46 -07:00
2023-06-28 09:58:58 -07:00
pub fn init < R : tauri ::Runtime > ( ) -> tauri ::plugin ::TauriPlugin < R > {
tauri ::plugin ::Builder ::new ( " utils " )
. invoke_handler ( tauri ::generate_handler! [
2023-08-04 20:33:50 -07:00
get_os ,
2023-06-28 09:58:58 -07:00
should_disable_mouseover ,
2024-08-21 01:08:26 +02:00
highlight_in_folder ,
open_path ,
2023-09-12 09:27:03 -07:00
show_launcher_logs_folder ,
2023-06-28 09:58:58 -07:00
progress_bars_list ,
2024-07-24 11:03:19 -07:00
get_opening_command
2023-06-28 09:58:58 -07:00
] )
. build ( )
}
2023-08-04 20:33:50 -07:00
/// Gets OS
#[ tauri::command ]
pub fn get_os ( ) -> OS {
#[ cfg(target_os = " windows " ) ]
let os = OS ::Windows ;
#[ cfg(target_os = " linux " ) ]
let os = OS ::Linux ;
#[ cfg(target_os = " macos " ) ]
let os = OS ::MacOS ;
os
}
#[ derive(Debug, Clone, Serialize, Deserialize) ]
2024-07-09 15:17:38 -07:00
#[ allow(clippy::enum_variant_names) ]
2023-08-04 20:33:50 -07:00
pub enum OS {
Windows ,
Linux ,
MacOS ,
}
2023-06-28 09:58:58 -07:00
// Lists active progress bars
// Create a new HashMap with the same keys
// Values provided should not be used directly, as they are not guaranteed to be up-to-date
#[ tauri::command ]
pub async fn progress_bars_list (
2024-08-16 23:20:11 -07:00
) -> Result < DashMap < uuid ::Uuid , theseus ::LoadingBar > > {
2023-06-28 09:58:58 -07:00
let res = theseus ::EventState ::list_progress_bars ( ) . await ? ;
Ok ( res )
}
2023-06-02 07:09:46 -07:00
// cfg only on mac os
// disables mouseover and fixes a random crash error only fixed by recent versions of macos
#[ cfg(target_os = " macos " ) ]
#[ tauri::command ]
pub async fn should_disable_mouseover ( ) -> bool {
// We try to match version to 12.2 or higher. If unrecognizable to pattern or lower, we default to the css with disabled mouseover for safety
let os = os_info ::get ( ) ;
if let os_info ::Version ::Semantic ( major , minor , _ ) = os . version ( ) {
if * major > = 12 & & * minor > = 3 {
// Mac os version is 12.3 or higher, we allow mouseover
return false ;
}
}
true
}
#[ cfg(not(target_os = " macos " )) ]
#[ tauri::command ]
pub async fn should_disable_mouseover ( ) -> bool {
false
}
#[ tauri::command ]
2024-08-21 01:08:26 +02:00
pub fn highlight_in_folder ( path : PathBuf ) {
2024-08-16 23:20:11 -07:00
let res = opener ::reveal ( path ) ;
2023-06-02 07:09:46 -07:00
2024-08-16 23:20:11 -07:00
if let Err ( e ) = res {
2024-08-21 01:08:26 +02:00
tracing ::error! ( " Failed to highlight file in folder: {} " , e ) ;
}
}
#[ tauri::command ]
pub fn open_path ( path : PathBuf ) {
let res = opener ::open ( path ) ;
if let Err ( e ) = res {
tracing ::error! ( " Failed to open path: {} " , e ) ;
2024-08-16 23:20:11 -07:00
}
2023-06-02 07:09:46 -07:00
}
2023-06-30 08:11:32 -07:00
2023-09-12 09:27:03 -07:00
#[ tauri::command ]
2024-08-16 23:20:11 -07:00
pub fn show_launcher_logs_folder ( ) {
2023-09-12 09:27:03 -07:00
let path = DirectoryInfo ::launcher_logs_dir ( ) . unwrap_or_default ( ) ;
// failure to get folder just opens filesystem
// (ie: if in debug mode only and launcher_logs never created)
2024-08-21 01:08:26 +02:00
open_path ( path ) ;
2023-09-12 09:27:03 -07:00
}
2023-06-30 08:11:32 -07:00
// Get opening command
// For example, if a user clicks on an .mrpack to open the app.
// This should be called once and only when the app is done booting up and ready to receive a command
// Returns a Command struct- see events.js
#[ tauri::command ]
2024-08-16 23:20:11 -07:00
#[ cfg(target_os = " macos " ) ]
pub async fn get_opening_command (
state : tauri ::State < '_ , crate ::macos ::deep_link ::InitialPayload > ,
) -> Result < Option < CommandPayload > > {
let payload = state . payload . lock ( ) . await ;
return if let Some ( payload ) = payload . as_ref ( ) {
tracing ::info! ( " opening command {payload} " ) ;
Ok ( Some ( handler ::parse_command ( payload ) . await ? ) )
} else {
Ok ( None )
} ;
}
#[ tauri::command ]
#[ cfg(not(target_os = " macos " )) ]
2023-06-30 08:11:32 -07:00
pub async fn get_opening_command ( ) -> Result < Option < CommandPayload > > {
// Tauri is not CLI, we use arguments as path to file to call
2024-08-16 23:20:11 -07:00
let cmd_arg = std ::env ::args_os ( ) . nth ( 1 ) ;
tracing ::info! ( " opening command {cmd_arg:?} " ) ;
2023-06-30 08:11:32 -07:00
let cmd_arg = cmd_arg . map ( | path | path . to_string_lossy ( ) . to_string ( ) ) ;
if let Some ( cmd ) = cmd_arg {
tracing ::debug! ( " Opening command: {:?} " , cmd ) ;
return Ok ( Some ( handler ::parse_command ( & cmd ) . await ? ) ) ;
}
Ok ( None )
}
// helper function called when redirected by a weblink (ie: modrith://do-something) or when redirected by a .mrpack file (in which case its a filepath)
// We hijack the deep link library (which also contains functionality for instance-checking)
pub async fn handle_command ( command : String ) -> Result < ( ) > {
Ok ( theseus ::handler ::parse_and_emit_command ( & command ) . await ? )
}