gtasks_core 0.1.0

Core logic for Google Tasks TUI
use std::fmt;

#[derive(Debug)]
pub enum GTasksError {
    Database(rusqlite::Error),
    Http(reqwest::Error),
    Auth(String),
    Io(std::io::Error),
    TaskNotFound(String),
    Other(String),
}

impl fmt::Display for GTasksError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            GTasksError::Database(err) => write!(f, "Database error: {err}"),
            GTasksError::Http(err) => write!(f, "HTTP API error: {err}"),
            GTasksError::Auth(msg) => write!(f, "Authentication error: {msg}"),
            GTasksError::Io(err) => write!(f, "I/O error: {err}"),
            GTasksError::TaskNotFound(id) => write!(f, "Task not found: {id}"),
            GTasksError::Other(msg) => write!(f, "Error: {msg}"),
        }
    }
}

impl std::error::Error for GTasksError {
    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
        match self {
            GTasksError::Database(err) => Some(err),
            GTasksError::Http(err) => Some(err),
            GTasksError::Io(err) => Some(err),
            _ => None,
        }
    }
}

impl From<rusqlite::Error> for GTasksError {
    fn from(err: rusqlite::Error) -> Self {
        GTasksError::Database(err)
    }
}

impl From<reqwest::Error> for GTasksError {
    fn from(err: reqwest::Error) -> Self {
        GTasksError::Http(err)
    }
}

impl From<std::io::Error> for GTasksError {
    fn from(err: std::io::Error) -> Self {
        GTasksError::Io(err)
    }
}

impl From<&str> for GTasksError {
    fn from(msg: &str) -> Self {
        GTasksError::Other(msg.to_string())
    }
}

impl From<String> for GTasksError {
    fn from(msg: String) -> Self {
        GTasksError::Other(msg)
    }
}

pub type Result<T> = std::result::Result<T, GTasksError>;