1use chrono::{DateTime, Utc};
2use thiserror::Error;
3
4#[derive(Debug, Error)]
6pub enum DownloaderErr {
7 #[error("HTTP request failed: {0}")]
9 Http(#[source] reqwest::Error),
10 #[error("I/O error: {0}")]
12 Io(#[source] std::io::Error),
13}
14
15#[derive(Debug, Error)]
17pub enum OsvDbNewErr {
18 #[error("failed to create or access the database directory: {0}")]
20 Io(#[source] std::io::Error),
21}
22
23#[derive(Debug, Error)]
25pub enum GetRecordErr {
26 #[error("failed to open or read record file: {0}")]
28 Io(#[source] std::io::Error),
29 #[error("failed to deserialize OSV record: {0}")]
31 Json(#[source] serde_json::Error),
32}
33
34#[derive(Debug, Error)]
36pub enum RecordsIterErr {
37 #[error("failed to read the records directory: {0}")]
39 ReadDir(#[source] std::io::Error),
40}
41
42#[derive(Debug, Error)]
45pub enum ReadRecordErr {
46 #[error("failed to read record file: {0}")]
48 Io(#[source] std::io::Error),
49 #[error("failed to deserialize OSV record: {0}")]
51 Json(#[source] serde_json::Error),
52}
53
54#[derive(Debug, Error)]
56pub enum ParseModifiedRecordErr {
57 #[error("expected 2 columns, got {0}")]
59 WrongColumnCount(usize),
60 #[error("missing timestamp column")]
62 MissingTimestamp,
63 #[error("missing path column")]
65 MissingPath,
66 #[error("invalid timestamp: {0}")]
68 ParseTimestamp(#[source] chrono::ParseError),
69 #[error("invalid ecosystem: {0}")]
71 ParseEcosystem(#[source] strum::ParseError),
72 #[error("invalid path format, expected `<ecosystem>/<id>`, got: `{0}`")]
74 InvalidPathFormat(String),
75}
76
77#[derive(Debug, Error)]
79pub enum DownloadLatestErr {
80 #[error("I/O error: {0}")]
82 Io(#[source] std::io::Error),
83 #[error("download error: {0}")]
85 Download(#[source] DownloaderErr),
86 #[error("ZIP archive error: {0}")]
88 Zip(#[source] zip::result::ZipError),
89 #[error("CSV parsing error: {0}")]
91 Csv(#[source] csv::Error),
92 #[error("failed to parse modified record: {0}")]
94 ParseRecord(#[source] ParseModifiedRecordErr),
95 #[error("modified_id.csv contains no entries")]
97 EmptyModifiedCsv,
98 #[error("timestamp `{0}` is outside the representable nanosecond range")]
100 TimestampOutOfRange(DateTime<Utc>),
101}
102
103#[derive(Debug, Error)]
105pub enum SyncErr {
106 #[error("I/O error: {0}")]
108 Io(#[source] std::io::Error),
109 #[error("download error: {0}")]
111 Download(#[source] DownloaderErr),
112 #[error("CSV parsing error: {0}")]
114 Csv(#[source] csv::Error),
115 #[error("failed to parse modified record: {0}")]
117 ParseRecord(#[source] ParseModifiedRecordErr),
118 #[error("background task panicked: {0}")]
120 Join(#[source] tokio::task::JoinError),
121 #[error("timestamp `{0}` is outside the representable nanosecond range")]
123 TimestampOutOfRange(DateTime<Utc>),
124}