You've already forked AstralRinth
* Update Java dependencies * Baselint lint fixes * Update Rust version * Update actix-files 0.6.6 -> 0.6.8 * Update actix-http 3.11.0 -> 3.11.2 * Update actix-rt 2.10.0 -> 2.11.0 * Update async_zip 0.0.17 -> 0.0.18 * Update async-compression 0.4.27 -> 0.4.32 * Update async-trait 0.1.88 -> 0.1.89 * Update async-tungstenite 0.30.0 -> 0.31.0 * Update const_format 0.2.34 -> 0.2.35 * Update bitflags 2.9.1 -> 2.9.4 * Update bytemuck 1.23.1 -> 1.24.0 * Update typed-path 0.11.0 -> 0.12.0 * Update chrono 0.4.41 -> 0.4.42 * Update cidre 0.11.2 -> 0.11.3 * Update clap 4.5.43 -> 4.5.48 * Update data-url 0.3.1 -> 0.3.2 * Update discord-rich-presence 0.2.5 -> 1.0.0 * Update enumset 1.1.7 -> 1.1.10 * Update flate2 1.1.2 -> 1.1.4 * Update hyper 1.6.0 -> 1.7.0 * Update hyper-util 0.1.16 -> 0.1.17 * Update iana-time-zone 0.1.63 -> 0.1.64 * Update image 0.25.6 -> 0.25.8 * Update indexmap 2.10.0 -> 2.11.4 * Update json-patch 4.0.0 -> 4.1.0 * Update meilisearch-sdk 0.29.1 -> 0.30.0 * Update clickhouse 0.13.3 -> 0.14.0 * Fix some prettier things * Update lettre 0.11.18 -> 0.11.19 * Update phf 0.12.1 -> 0.13.1 * Update png 0.17.16 -> 0.18.0 * Update quick-xml 0.38.1 -> 0.38.3 * Update redis 0.32.4 -> 0.32.7 * Update regex 1.11.1 -> 1.11.3 * Update reqwest 0.12.22 -> 0.12.23 * Update rust_decimal 1.37.2 -> 1.38.0 * Update rust-s3 0.35.1 -> 0.37.0 * Update serde 1.0.219 -> 1.0.228 * Update serde_bytes 0.11.17 -> 0.11.19 * Update serde_json 1.0.142 -> 1.0.145 * Update serde_with 3.14.0 -> 3.15.0 * Update sentry 0.42.0 -> 0.45.0 and sentry-actix 0.42.0 -> 0.45.0 * Update spdx 0.10.9 -> 0.12.0 * Update sysinfo 0.36.1 -> 0.37.2 * Update tauri 2.7.0 -> 2.8.5 * Update tauri-build 2.3.1 -> 2.4.1 * Update tauri-plugin-deep-link 2.4.1 -> 2.4.3 * Update tauri-plugin-dialog 2.3.2 -> 2.4.0 * Update tauri-plugin-http 2.5.1 -> 2.5.2 * Update tauri-plugin-opener 2.4.0 -> 2.5.0 * Update tauri-plugin-os 2.3.0 -> 2.3.1 * Update tauri-plugin-single-instance 2.3.2 -> 2.3.4 * Update tempfile 3.20.0 -> 3.23.0 * Update thiserror 2.0.12 -> 2.0.17 * Update tracing-subscriber 0.3.19 -> 0.3.20 * Update url 2.5.4 -> 2.5.7 * Update uuid 1.17.0 -> 1.18.1 * Update webp 0.3.0 -> 0.3.1 * Update whoami 1.6.0 -> 1.6.1 * Note that windows and windows-core can't be updated yet * Update zbus 5.9.0 -> 5.11.0 * Update zip 4.3.0 -> 6.0.0 * Fix build * Enforce rustls crypto provider * Refresh Cargo.lock * Update transitive dependencies * Bump Gradle usage to Java 17 * Use ubuntu-latest consistently across workflows * Fix lint * Fix lint in Rust * Update native-dialog 0.9.0 -> 0.9.2 * Update regex 1.11.3 -> 1.12.2 * Update reqwest 0.12.23 -> 0.12.24 * Update rust_decimal 1.38.0 -> 1.39.0 * Remaining lock-only updates * chore: move TLS impl of some other dependencies to aws-lc-rs The AWS bloatware "virus" expands by sheer force of widespread adoption by the ecosystem... 🫣 * chore(fmt): run Tombi --------- Co-authored-by: Alejandro González <me@alegon.dev>
221 lines
5.8 KiB
Rust
221 lines
5.8 KiB
Rust
//! Theseus error type
|
|
use std::sync::Arc;
|
|
|
|
use crate::{profile, util};
|
|
use data_url::DataUrlError;
|
|
use derive_more::Display;
|
|
use serde::{Deserialize, Serialize};
|
|
use tracing_error::InstrumentError;
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Display)]
|
|
#[display("{description}")]
|
|
pub struct LabrinthError {
|
|
pub error: String,
|
|
pub description: String,
|
|
}
|
|
|
|
#[derive(thiserror::Error, Debug)]
|
|
pub enum ErrorKind {
|
|
#[error("Filesystem error: {0}")]
|
|
FSError(String),
|
|
|
|
#[error("Serialization error (INI): {0}")]
|
|
INIError(#[from] serde_ini::de::Error),
|
|
|
|
#[error("Serialization error (JSON): {0}")]
|
|
JSONError(#[from] serde_json::Error),
|
|
|
|
#[error("Serialization error (NBT): {0}")]
|
|
NBTError(#[from] quartz_nbt::io::NbtIoError),
|
|
|
|
#[error("NBT data structure error: {0}")]
|
|
NBTReprError(#[from] quartz_nbt::NbtReprError),
|
|
|
|
#[error("Serialization error (websocket): {0}")]
|
|
WebsocketSerializationError(
|
|
#[from] ariadne::networking::serialization::SerializationError,
|
|
),
|
|
|
|
#[error("Error parsing UUID: {0}")]
|
|
UUIDError(#[from] uuid::Error),
|
|
|
|
#[error("Error parsing URL: {0}")]
|
|
URLError(#[from] url::ParseError),
|
|
|
|
#[error("Unable to read {0} from any source")]
|
|
NoValueFor(String),
|
|
|
|
#[error("Metadata error: {0}")]
|
|
MetadataError(#[from] daedalus::Error),
|
|
|
|
#[error("Minecraft authentication error: {0}")]
|
|
MinecraftAuthenticationError(
|
|
#[from] crate::state::MinecraftAuthenticationError,
|
|
),
|
|
|
|
#[error("I/O error: {0}")]
|
|
IOError(#[from] util::io::IOError),
|
|
|
|
#[error("I/O (std) error: {0}")]
|
|
StdIOError(#[from] std::io::Error),
|
|
|
|
#[error("Error launching Minecraft: {0}")]
|
|
LauncherError(String),
|
|
|
|
#[error("Error fetching URL: {0}")]
|
|
FetchError(#[from] reqwest::Error),
|
|
|
|
#[error("{0}")]
|
|
LabrinthError(LabrinthError),
|
|
|
|
#[error("Websocket error: {0}")]
|
|
WSError(#[from] async_tungstenite::tungstenite::Error),
|
|
|
|
#[error("Websocket closed before {0} could be received!")]
|
|
WSClosedError(String),
|
|
|
|
#[error("Incorrect Sha1 hash for download: {0} != {1}")]
|
|
HashError(String, String),
|
|
|
|
#[error("Regex error: {0}")]
|
|
RegexError(#[from] regex::Error),
|
|
|
|
#[error("Paths stored in the database need to be valid UTF-8: {0}")]
|
|
UTFError(std::path::PathBuf),
|
|
|
|
#[error("Invalid input: {0}")]
|
|
InputError(String),
|
|
|
|
#[error("Join handle error: {0}")]
|
|
JoinError(#[from] tokio::task::JoinError),
|
|
|
|
#[error("Recv error: {0}")]
|
|
RecvError(#[from] tokio::sync::oneshot::error::RecvError),
|
|
|
|
#[error("Error acquiring semaphore: {0}")]
|
|
AcquireError(#[from] tokio::sync::AcquireError),
|
|
|
|
#[error("Profile {0} is not managed by the app!")]
|
|
UnmanagedProfileError(String),
|
|
|
|
#[error("Could not create profile: {0}")]
|
|
ProfileCreationError(#[from] profile::create::ProfileCreationError),
|
|
|
|
#[error("User is not logged in, no credentials available!")]
|
|
NoCredentialsError,
|
|
|
|
#[error("JRE error: {0}")]
|
|
JREError(#[from] crate::util::jre::JREError),
|
|
|
|
#[error("Error parsing date: {0}")]
|
|
ChronoParseError(#[from] chrono::ParseError),
|
|
|
|
#[error("Event error: {0}")]
|
|
EventError(#[from] crate::event::EventError),
|
|
|
|
#[error("Zip error: {0}")]
|
|
ZipError(#[from] async_zip::error::ZipError),
|
|
|
|
#[error("File watching error: {0}")]
|
|
NotifyError(#[from] notify::Error),
|
|
|
|
#[error("Error stripping prefix: {0}")]
|
|
StripPrefixError(#[from] std::path::StripPrefixError),
|
|
|
|
#[error("Error: {0}")]
|
|
OtherError(String),
|
|
|
|
#[cfg(feature = "tauri")]
|
|
#[error("Tauri error: {0}")]
|
|
TauriError(#[from] tauri::Error),
|
|
|
|
#[error("Error interacting with database: {0}")]
|
|
Sqlx(#[from] sqlx::Error),
|
|
|
|
#[error("Error while applying migrations: {0}")]
|
|
SqlxMigrate(#[from] sqlx::migrate::MigrateError),
|
|
|
|
#[error("Move directory error: {0}")]
|
|
DirectoryMoveError(String),
|
|
|
|
#[error("Error resolving DNS: {0}")]
|
|
DNSError(#[from] hickory_resolver::ResolveError),
|
|
|
|
#[error("An online profile for {user_name} is not available")]
|
|
OnlineMinecraftProfileUnavailable { user_name: String },
|
|
|
|
#[error("Invalid data URL: {0}")]
|
|
InvalidDataUrl(#[from] DataUrlError),
|
|
|
|
#[error("Invalid data URL: {0}")]
|
|
InvalidDataUrlBase64(#[from] data_url::forgiving_base64::InvalidBase64),
|
|
|
|
#[error("Invalid PNG")]
|
|
InvalidPng,
|
|
|
|
#[error("Invalid PNG: {0}")]
|
|
PngDecodingError(#[from] png::DecodingError),
|
|
|
|
#[error("PNG encoding error: {0}")]
|
|
PngEncodingError(#[from] png::EncodingError),
|
|
|
|
#[error(
|
|
"A skin texture must have a dimension of either 64x64 or 64x32 pixels"
|
|
)]
|
|
InvalidSkinTexture,
|
|
|
|
#[error("RPC error: {0}")]
|
|
RpcError(String),
|
|
|
|
#[cfg(windows)]
|
|
#[error("Windows error: {0}")]
|
|
WindowsError(#[from] windows_core::Error),
|
|
|
|
#[error("zbus error: {0}")]
|
|
ZbusError(#[from] zbus::Error),
|
|
|
|
#[error("Deserialization error: {0}")]
|
|
DeserializationError(#[from] serde::de::value::Error),
|
|
|
|
#[error("Discord IPC error: {0}")]
|
|
DiscordRichPresenceError(#[from] discord_rich_presence::error::Error),
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct Error {
|
|
pub raw: Arc<ErrorKind>,
|
|
pub source: tracing_error::TracedError<Arc<ErrorKind>>,
|
|
}
|
|
|
|
impl std::error::Error for Error {
|
|
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
|
|
self.source.source()
|
|
}
|
|
}
|
|
|
|
impl std::fmt::Display for Error {
|
|
fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
write!(fmt, "{}", self.source)
|
|
}
|
|
}
|
|
|
|
impl<E: Into<ErrorKind>> From<E> for Error {
|
|
fn from(source: E) -> Self {
|
|
let error = Into::<ErrorKind>::into(source);
|
|
let boxed_error = Arc::new(error);
|
|
|
|
Self {
|
|
raw: boxed_error.clone(),
|
|
source: boxed_error.in_current_span(),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl ErrorKind {
|
|
pub fn as_error(self) -> Error {
|
|
self.into()
|
|
}
|
|
}
|
|
|
|
pub type Result<T> = core::result::Result<T, Error>;
|