use serde::ser::SerializeStruct; use serde::{Serialize, Serializer}; use thiserror::Error; pub mod auth; pub mod jre; pub mod logs; pub mod metadata; pub mod pack; pub mod process; pub mod profile; pub mod profile_create; pub mod settings; pub mod tags; pub type Result = std::result::Result; // Main returnable Theseus GUI error // Needs to be Serializable to be returned to the JavaScript side #[derive(Error, Debug, Serialize)] pub enum TheseusGuiError { #[error(transparent)] Serializable(TheseusSerializableError), } // Serializable error intermediary, so TheseusGuiError can be Serializable (eg: so that we can return theseus::Errors in Tauri directly) #[derive(Error, Debug)] pub enum TheseusSerializableError { #[error("{0}")] Theseus(#[from] theseus::Error), #[error("IO error: {0}")] IO(#[from] std::io::Error), #[error("No profile found at {0}")] NoProfileFound(String), } // Generic implementation of From for ErrorTypeA impl From for TheseusGuiError where TheseusSerializableError: From, { fn from(error: T) -> Self { TheseusGuiError::Serializable(TheseusSerializableError::from(error)) } } // Lists active progress bars #[tauri::command] pub async fn progress_bars_list( ) -> Result> { let res = theseus::EventState::list_progress_bars().await?; Ok(res) } // This is a very simple macro that implements a very basic Serializable for each variant of TheseusSerializableError, // where the field is the string. (This allows easy extension to errors without many match arms) macro_rules! impl_serialize { ($($variant:ident),* $(,)?) => { impl Serialize for TheseusSerializableError { fn serialize(&self, serializer: S) -> std::result::Result where S: Serializer, { match self { $( TheseusSerializableError::$variant(message) => { let mut state = serializer.serialize_struct(stringify!($variant), 2)?; state.serialize_field("field_name", stringify!($variant))?; state.serialize_field("message", &message.to_string())?; state.end() }, )* } } } }; } // Use the macro to implement Serialize for TheseusSerializableError impl_serialize! { Theseus, IO, NoProfileFound, }