// Copyright: Ankitects Pty Ltd and contributors // License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html pub use failure::{Error, Fail}; use std::io; pub type Result = std::result::Result; #[derive(Debug, Fail)] pub enum AnkiError { #[fail(display = "invalid input: {}", info)] InvalidInput { info: String }, #[fail(display = "invalid card template: {}", info)] TemplateError { info: String, q_side: bool }, #[fail(display = "I/O error: {}", info)] IOError { info: String }, #[fail(display = "DB error: {}", info)] DBError { info: String }, #[fail(display = "Network error: {}", info)] NetworkError { info: String }, #[fail(display = "AnkiWeb authentication failed.")] AnkiWebAuthenticationFailed, #[fail(display = "AnkiWeb error: {}", info)] AnkiWebMiscError { info: String }, #[fail(display = "The user interrupted the operation.")] Interrupted, } // error helpers impl AnkiError { pub(crate) fn invalid_input>(s: S) -> AnkiError { AnkiError::InvalidInput { info: s.into() } } } #[derive(Debug, PartialEq)] pub enum TemplateError { NoClosingBrackets(String), ConditionalNotClosed(String), ConditionalNotOpen { closed: String, currently_open: Option, }, FieldNotFound { filters: String, field: String, }, } impl From for AnkiError { fn from(err: io::Error) -> Self { AnkiError::IOError { info: format!("{:?}", err), } } } impl From for AnkiError { fn from(err: rusqlite::Error) -> Self { AnkiError::DBError { info: format!("{:?}", err), } } } impl From for AnkiError { fn from(err: rusqlite::types::FromSqlError) -> Self { AnkiError::DBError { info: format!("{:?}", err), } } } impl From for AnkiError { fn from(err: reqwest::Error) -> Self { let url = err.url().map(|url| url.as_str()).unwrap_or(""); let str_err = format!("{}", err); // strip url from error to avoid exposing keys let str_err = str_err.replace(url, ""); AnkiError::NetworkError { info: str_err } } } impl From for AnkiError { fn from(err: zip::result::ZipError) -> Self { AnkiError::AnkiWebMiscError { info: format!("{:?}", err), } } } impl From for AnkiError { fn from(err: serde_json::Error) -> Self { AnkiError::AnkiWebMiscError { info: format!("{:?}", err), } } }