1use thiserror::Error;
4
5pub type Result<T> = std::result::Result<T, AnkiError>;
6
7#[derive(Error, Debug)]
9pub enum AnkiError {
10 #[error(transparent)]
12 AnkiConnectError(#[from] AnkiConnectError),
13
14 #[error("HTTP request failed: {0}")]
16 HttpError(#[from] ureq::Error),
17
18 #[error("JSON parsing failed: {0}")]
20 JsonError(String),
21
22 #[error("Invalid field '{field_name}' for model '{model_name}'")]
24 InvalidField {
25 field_name: String,
26 model_name: String,
27 },
28
29 #[error("Validation error: {0}")]
31 ValidationError(String),
32
33 #[error("Unknown error: {0}")]
34 UnknownError(String),
35}
36
37#[derive(Error, Debug)]
39pub enum AnkiConnectError {
40 #[error("Unsupported action")]
42 UnsupportedAction,
43
44 #[error("The field values would make an empty question")]
46 EmptyQuestion,
47
48 #[error("Model not found: {0}")]
50 ModelNotFound(String),
51
52 #[error("Deck not found: {0}")]
54 DeckNotFound(String),
55
56 #[error("Duplicate note")]
58 DuplicateNote,
59
60 #[error("Empty note")]
62 EmptyNote,
63
64 #[error("Missing media field (provide data, path, or URL)")]
66 MissingMediaField,
67
68 #[error("Model name already exists")]
70 ModelNameExists,
71
72 #[error("Invalid column ID: {0}")]
74 InvalidColumnId(String),
75
76 #[error("Invalid card order: {0}")]
78 InvalidCardOrder(String),
79
80 #[error("Other error: {0}")]
82 Other(String),
83}
84
85#[derive(Error, Debug)]
87pub enum NoteError {
88 #[error("Missing required field: {0}")]
90 MissingField(String),
91
92 #[error("Unknown field: {0}")]
94 UnknownField(String),
95
96 #[error("Empty content for field: {0}")]
98 EmptyField(String),
99
100 #[error("The provided field content would result in an empty question")]
102 EmptyQuestion,
103
104 #[error("Invalid media: {0}")]
106 InvalidMedia(String),
107
108 #[error("Note would be a duplicate of an existing note")]
110 DuplicateNote,
111
112 #[error("Note validation error: {0}")]
114 ValidationError(String),
115
116 #[error("Field content validation error for '{field}': {message}")]
118 FieldValidationError { field: String, message: String },
119
120 #[error("Anki error: {0}")]
122 AnkiError(#[from] AnkiError),
123}
124
125impl From<AnkiConnectError> for NoteError {
127 fn from(err: AnkiConnectError) -> Self {
128 use crate::error::AnkiConnectError;
129 match err {
130 AnkiConnectError::EmptyQuestion => NoteError::EmptyQuestion,
131 AnkiConnectError::DuplicateNote => NoteError::DuplicateNote,
132 AnkiConnectError::EmptyNote => NoteError::ValidationError("Note is empty".to_string()),
133 e => NoteError::AnkiError(e.into()),
134 }
135 }
136}