use serde::{Deserialize, Serialize};
use thiserror::Error;
#[derive(Debug, Clone, Error, Serialize, Deserialize)]
pub enum GuiError {
#[error("Authentication failed: {reason}")]
AuthFailed { reason: String },
#[error("Network unreachable: {details}")]
NetworkUnreachable { details: String },
#[error("Configuration invalid: {field} - {reason}")]
ConfigInvalid { field: String, reason: String },
#[error("Connection closed: {reason}")]
ConnectionClosed { reason: String },
#[error("IPC error: {0}")]
Ipc(String),
#[error("Daemon error: {0}")]
Daemon(String),
#[error("Timeout: {0}")]
Timeout(String),
#[error("Permission denied: {0}")]
PermissionDenied(String),
#[error("{0}")]
Other(String),
}
impl GuiError {
pub fn auth_failed(reason: impl Into<String>) -> Self {
Self::AuthFailed {
reason: reason.into(),
}
}
pub fn network_unreachable(details: impl Into<String>) -> Self {
Self::NetworkUnreachable {
details: details.into(),
}
}
pub fn config_invalid(field: impl Into<String>, reason: impl Into<String>) -> Self {
Self::ConfigInvalid {
field: field.into(),
reason: reason.into(),
}
}
pub fn connection_closed(reason: impl Into<String>) -> Self {
Self::ConnectionClosed {
reason: reason.into(),
}
}
pub fn ipc(msg: impl Into<String>) -> Self {
Self::Ipc(msg.into())
}
pub fn daemon(msg: impl Into<String>) -> Self {
Self::Daemon(msg.into())
}
pub fn timeout(msg: impl Into<String>) -> Self {
Self::Timeout(msg.into())
}
pub fn permission_denied(msg: impl Into<String>) -> Self {
Self::PermissionDenied(msg.into())
}
pub fn other(msg: impl Into<String>) -> Self {
Self::Other(msg.into())
}
}
impl From<std::io::Error> for GuiError {
fn from(err: std::io::Error) -> Self {
match err.kind() {
std::io::ErrorKind::PermissionDenied => Self::permission_denied(err.to_string()),
std::io::ErrorKind::TimedOut => Self::timeout(err.to_string()),
std::io::ErrorKind::ConnectionRefused
| std::io::ErrorKind::ConnectionReset
| std::io::ErrorKind::ConnectionAborted => Self::connection_closed(err.to_string()),
_ => Self::other(err.to_string()),
}
}
}
impl From<quincy::QuincyError> for GuiError {
fn from(err: quincy::QuincyError) -> Self {
Self::Other(err.to_string())
}
}
impl From<serde_json::Error> for GuiError {
fn from(err: serde_json::Error) -> Self {
Self::Other(format!("JSON error: {}", err))
}
}