neocities_client/
error.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
////////       This file is part of the source code for neocities-client, a Rust           ////////
////////       library for interacting with the https://neocities.org/ API.                ////////
////////                                                                                   ////////
////////                           Copyright © 2024  André Kugland                         ////////
////////                                                                                   ////////
////////       This program is free software: you can redistribute it and/or modify        ////////
////////       it under the terms of the GNU General Public License as published by        ////////
////////       the Free Software Foundation, either version 3 of the License, or           ////////
////////       (at your option) any later version.                                         ////////
////////                                                                                   ////////
////////       This program is distributed in the hope that it will be useful,             ////////
////////       but WITHOUT ANY WARRANTY; without even the implied warranty of              ////////
////////       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the                ////////
////////       GNU General Public License for more details.                                ////////
////////                                                                                   ////////
////////       You should have received a copy of the GNU General Public License           ////////
////////       along with this program. If not, see https://www.gnu.org/licenses/.         ////////

//! This module contains the types used for error handling in this crate.

use parse_display::{Display, FromStr};
use thiserror::Error as ThisError;

#[derive(ThisError, Debug)]
pub enum Error {
    /// Transport errors returned by [`ureq`].
    #[error("Transport error: {0}")]
    Transport(#[from] ureq::Transport),

    /// Errors when deserializing JSON.
    #[error("JSON error: {0}")]
    Json(#[from] serde_json::Error),

    /// API error are the errors returned as part of a JSON response body from the API.
    #[error("API error: {message} ({kind})")]
    Api {
        /// The error message returned by the API.
        message: String,
        /// The kind of error returned by the API.
        kind: ErrorKind,
    },
}

/// Kinds of error returned by the API.
///
/// These errors are not clearly documented by the API, this list is a reverse-engineered list of
/// errors returned by the API.
///
/// [`ErrorKind::Status`] is not returned as part of a JSON response body, but is instead generated
/// when the server returns a 4xx or 5xx status code and we can't parse the response as JSON.
#[derive(Display, FromStr, Debug, PartialEq)]
#[display(style = "snake_case")]
pub enum ErrorKind {
    /// The site you asked for doesn't exist.
    SiteNotFound,
    /// Authentication failed
    InvalidAuth,
    /// You tried to delete `/index.html`.
    CannotDeleteIndex,
    /// You tried to delete `/`.
    CannotDeleteSiteDirectory,
    /// You tried to delete a file that doesn't exist.
    MissingFiles,
    /// You tried to upload a file with a prohibited extension.
    InvalidFileType,
    /// Server returned a 4xx/5xx status code and we couldn't parse the response as JSON.
    #[from_str(ignore)]
    Status,
    /// An unknown error occurred.
    #[from_str(ignore)]
    Unknown,
}

/// The result type used by this crate.
pub type Result<T> = std::result::Result<T, Error>;