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
use std::io;

use failure::Fail;
use reqwest::{self, header::InvalidHeaderValue};
use serde_json;

#[derive(Fail, Debug)]
pub enum SendgridError {
    #[fail(display = "IO Error: {}", _0)]
    Io(#[cause] io::Error),
    #[fail(display = "JSON Error: {}", _0)]
    JSONDecode(#[cause] serde_json::Error),
    #[fail(display = "HTTP Error: {}", _0)]
    ReqwestError(#[cause] reqwest::Error),
    #[fail(display = "Invalid Header Error: {}", _0)]
    InvalidHeader(#[cause] InvalidHeaderValue),
    #[fail(display = "could not UTF-8 decode this filename")]
    InvalidFilename,
    #[fail(display = "Request failed with StatusCode: {}", _0)]
    RequestNotSuccessful(reqwest::StatusCode, String),
}

impl From<reqwest::Error> for SendgridError {
    fn from(error: reqwest::Error) -> Self {
        SendgridError::ReqwestError(error)
    }
}

impl From<InvalidHeaderValue> for SendgridError {
    fn from(error: InvalidHeaderValue) -> Self {
        SendgridError::InvalidHeader(error)
    }
}

impl From<io::Error> for SendgridError {
    fn from(error: io::Error) -> Self {
        SendgridError::Io(error)
    }
}

impl From<serde_json::Error> for SendgridError {
    fn from(error: serde_json::Error) -> Self {
        SendgridError::JSONDecode(error)
    }
}

pub type SendgridResult<T> = Result<T, SendgridError>;