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
#![deny(missing_debug_implementations, missing_docs)]

//! SvcError is an implementation of RFC7807: Problem Details for HTTP APIs.

use http::StatusCode;

/// Problem Details
pub trait ProblemDetails: serde::Serialize {
    /// Return a URI reference RFC3986 that identifies the
    /// problem type.  This specification encourages that, when
    /// dereferenced, it provide human-readable documentation for the
    /// problem type. When this member is not present, its value is assumed
    /// to be "about:blank".
    fn kind(&self) -> &str;

    /// Return a short, human-readable summary of the problem
    /// type. It SHOULD NOT change from occurrence to occurrence of the
    /// problem, except for purposes of localization
    fn title(&self) -> &str;

    /// Return the HTTP status code generated by the origin server for this
    /// occurrence of the problem.
    fn status_code(&self) -> StatusCode;

    /// Set a kind and a title.
    fn set_kind(&mut self, kind: &str, title: &str) -> &mut Self;

    /// Set a status code.
    fn set_status_code(&mut self, value: StatusCode) -> &mut Self;
}

impl ProblemDetails for Error {
    fn set_kind(&mut self, kind: &str, title: &str) -> &mut Self {
        self.set_kind(kind, title)
    }

    fn status_code(&self) -> StatusCode {
        self.status_code()
    }

    fn kind(&self) -> &str {
        self.kind()
    }

    fn title(&self) -> &str {
        self.title()
    }

    fn set_status_code(&mut self, value: StatusCode) -> &mut Self {
        self.set_status_code(value)
    }
}

pub use self::error::{Builder, Error};
mod error;
mod extension;