// 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 }, } // 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), } } }