Struct http_api_problem::HttpApiProblem [−][src]
Description of a problem that can be returned by an HTTP API based on RFC7807
Example
{
"type": "https://example.com/probs/out-of-credit",
"title": "You do not have enough credit.",
"detail": "Your current balance is 30, but that costs 50.",
"instance": "/account/12345/msgs/abc",
}
Status Codes and Responses
Prefer to use one of the constructors which
ensure that a StatusCode is set. If no StatusCode is
set and a transformation to a response of a web framework
is made a StatusCode becomes mandatory which in this case will
default to 500
.
When receiving an HttpApiProblem there might be an invalid
StatusCode contained. In this case the status
field will be empty.
This is a trade off so that the recipient does not have to deal with
another error and can still have access to the remaining fields of the
struct.
Fields
type_url: Option<String>
A URI reference RFC3986 that identifies the problem type. This specification encourages that, when dereferenced, it provide human-readable documentation for the problem type (e.g., using HTML [W3C.REC-html5-20141028]). When this member is not present, its value is assumed to be “about:blank”.
status: Option<StatusCode>
The HTTP status code RFC7231, Section 6 generated by the origin server for this occurrence of the problem.
title: Option<String>
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 (e.g., using proactive content negotiation; see RFC7231, Section 3.4.
detail: Option<String>
A human-readable explanation specific to this occurrence of the problem.
instance: Option<String>
A URI reference that identifies the specific occurrence of the problem. It may or may not yield further information if dereferenced.
Implementations
impl HttpApiProblem
[src]
pub fn new<T: Into<StatusCode>>(status: T) -> Self
[src]
Creates a new instance with the given StatusCode.
#Example
use http_api_problem::*; let p = HttpApiProblem::new(StatusCode::INTERNAL_SERVER_ERROR); assert_eq!(Some(StatusCode::INTERNAL_SERVER_ERROR), p.status); assert_eq!(None, p.title); assert_eq!(None, p.detail); assert_eq!(None, p.type_url); assert_eq!(None, p.instance);
pub fn try_new<T: TryInto<StatusCode>>(
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
[src]
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
Creates a new instance with the given StatusCode.
Fails if the argument can not be converted into a StatusCode.
#Example
use http_api_problem::*; let p = HttpApiProblem::try_new(500).unwrap(); assert_eq!(Some(StatusCode::INTERNAL_SERVER_ERROR), p.status); assert_eq!(None, p.title); assert_eq!(None, p.detail); assert_eq!(None, p.type_url); assert_eq!(None, p.instance);
pub fn with_title<T: Into<StatusCode>>(status: T) -> Self
[src]
Creates a new instance with title
derived from a StatusCode.
#Example
use http_api_problem::*; let p = HttpApiProblem::with_title(StatusCode::NOT_FOUND); assert_eq!(Some(StatusCode::NOT_FOUND), p.status); assert_eq!(Some("Not Found"), p.title.as_deref()); assert_eq!(None, p.detail); assert_eq!(None, p.type_url); assert_eq!(None, p.instance);
pub fn try_with_title<T: TryInto<StatusCode>>(
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
[src]
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
Creates a new instance with title
derived from a StatusCode.
Fails if the argument can not be converted into a StatusCode.
#Example
use http_api_problem::*; let p = HttpApiProblem::try_with_title(404).unwrap(); assert_eq!(Some(StatusCode::NOT_FOUND), p.status); assert_eq!(Some("Not Found"), p.title.as_deref()); assert_eq!(None, p.detail); assert_eq!(None, p.type_url); assert_eq!(None, p.instance);
pub fn with_title_and_type<T: Into<StatusCode>>(status: T) -> Self
[src]
Creates a new instance with the title
and type_url
derived from the
StatusCode.
#Example
use http_api_problem::*; let p = HttpApiProblem::with_title_and_type(StatusCode::SERVICE_UNAVAILABLE); assert_eq!(Some(StatusCode::SERVICE_UNAVAILABLE), p.status); assert_eq!(Some("Service Unavailable"), p.title.as_deref()); assert_eq!(None, p.detail); assert_eq!(Some("https://httpstatuses.com/503".to_string()), p.type_url); assert_eq!(None, p.instance);
pub fn try_with_title_and_type<T: TryInto<StatusCode>>(
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
[src]
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
Creates a new instance with the title
and type_url
derived from the
StatusCode.
Fails if the argument can not be converted into a StatusCode.
#Example
use http_api_problem::*; let p = HttpApiProblem::try_with_title_and_type(503).unwrap(); assert_eq!(Some(StatusCode::SERVICE_UNAVAILABLE), p.status); assert_eq!(Some("Service Unavailable"), p.title.as_deref()); assert_eq!(None, p.detail); assert_eq!(Some("https://httpstatuses.com/503".to_string()), p.type_url); assert_eq!(None, p.instance);
pub fn empty() -> Self
[src]
Creates a new instance without any field set.
Prefer to use one of the other constructors which
ensure that a StatusCode is set. If no StatusCode is
set and a transformation to a response of a web framework
is made a StatusCode becomes mandatory which in this case will
default to 500
.
pub fn status<T: Into<StatusCode>>(self, status: T) -> Self
[src]
Sets the status
#Example
use http_api_problem::*; let p = HttpApiProblem::new(StatusCode::NOT_FOUND).title("Error"); assert_eq!(Some(StatusCode::NOT_FOUND), p.status); assert_eq!(Some("Error"), p.title.as_deref()); assert_eq!(None, p.detail); assert_eq!(None, p.type_url); assert_eq!(None, p.instance);
pub fn type_url<T: Into<String>>(self, type_url: T) -> Self
[src]
Sets the type_url
#Example
use http_api_problem::*; let p = HttpApiProblem::new(StatusCode::NOT_FOUND).type_url("http://example.com/my/real_error"); assert_eq!(Some(StatusCode::NOT_FOUND), p.status); assert_eq!(None, p.title); assert_eq!(None, p.detail); assert_eq!(Some("http://example.com/my/real_error".to_string()), p.type_url); assert_eq!(None, p.instance);
pub fn try_status<T: TryInto<StatusCode>>(
self,
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
[src]
self,
status: T
) -> Result<Self, InvalidStatusCode> where
T::Error: Into<InvalidStatusCode>,
Tries to set the status
Fails if the argument can not be converted into a StatusCode.
#Example
use http_api_problem::*; let p = HttpApiProblem::try_new(404).unwrap().title("Error"); assert_eq!(Some(StatusCode::NOT_FOUND), p.status); assert_eq!(Some("Error"), p.title.as_deref()); assert_eq!(None, p.detail); assert_eq!(None, p.type_url); assert_eq!(None, p.instance);
pub fn title<T: Into<String>>(self, title: T) -> Self
[src]
Sets the title
#Example
use http_api_problem::*; let p = HttpApiProblem::new(StatusCode::NOT_FOUND).title("Another Error"); assert_eq!(Some(StatusCode::NOT_FOUND), p.status); assert_eq!(Some("Another Error"), p.title.as_deref()); assert_eq!(None, p.detail); assert_eq!(None, p.type_url); assert_eq!(None, p.instance);
pub fn detail<T: Into<String>>(self, detail: T) -> HttpApiProblem
[src]
Sets the detail
#Example
use http_api_problem::*; let p = HttpApiProblem::new(StatusCode::NOT_FOUND).detail("a detailed description"); assert_eq!(Some(StatusCode::NOT_FOUND), p.status); assert_eq!(None, p.title); assert_eq!(Some("a detailed description".to_string()), p.detail); assert_eq!(None, p.type_url); assert_eq!(None, p.instance);
pub fn instance<T: Into<String>>(self, instance: T) -> HttpApiProblem
[src]
Sets the instance
#Example
use http_api_problem::*; let p = HttpApiProblem::new(StatusCode::NOT_FOUND).instance("/account/1234/withdraw"); assert_eq!(Some(StatusCode::NOT_FOUND), p.status); assert_eq!(None, p.title); assert_eq!(None, p.detail); assert_eq!(None, p.type_url); assert_eq!(Some("/account/1234/withdraw".to_string()), p.instance);
pub fn try_value<K, V>(self, key: K, value: &V) -> Result<Self, String> where
V: Serialize,
K: Into<String>,
[src]
V: Serialize,
K: Into<String>,
Add a value that must be serializable.
The key must not be one of the field names of this struct.
pub fn value<K, V>(self, key: K, value: &V) -> Self where
V: Serialize,
K: Into<String>,
[src]
V: Serialize,
K: Into<String>,
Add a value that must be serializable.
The key must not be one of the field names of this struct. If the key is a field name or the value is not serializable nothing happens.
pub fn set_value<K, V>(&mut self, key: K, value: &V) where
V: Serialize,
K: Into<String>,
[src]
V: Serialize,
K: Into<String>,
pub fn get_value<K, V>(&self, key: &str) -> Option<V> where
V: DeserializeOwned,
[src]
V: DeserializeOwned,
Returns the deserialized field for the given key.
If the key does not exist or the field is not deserializable to
the target type None
is returned
pub fn try_set_value<K, V>(&mut self, key: K, value: &V) -> Result<(), String> where
V: Serialize,
K: Into<String>,
[src]
V: Serialize,
K: Into<String>,
pub fn keys<K, V>(&self) -> impl Iterator<Item = &String> where
V: DeserializeOwned,
[src]
V: DeserializeOwned,
pub fn json_value(&self, key: &str) -> Option<&Value>
[src]
Returns the serde_json::Value
for the given key if the key exists.
pub fn json_bytes(&self) -> Vec<u8>
[src]
Serialize to a JSON Vec<u8>
pub fn json_string(&self) -> String
[src]
Serialize to a JSON String
pub fn to_hyper_response(&self) -> Response<Body>
[src]
Creates a hyper response.
If status is None
500 - Internal Server Error
is the
default.
Requires the hyper
feature
pub fn to_actix_response(&self) -> HttpResponse
[src]
Creates an actix
response.
If status is None
or not convertible
to an actix status 500 - Internal Server Error
is the
default.
Requires the actix-web
feature
pub fn to_salvo_response(&self) -> Response
[src]
Creates a salvo response.
If status is None
500 - Internal Server Error
is the
default.
Requires the salvo
feature
pub fn to_tide_response(&self) -> Response
[src]
Creates a tide response.
If status is None
500 - Internal Server Error
is the
default.
Requires the tide
feature
pub fn with_title_from_status<T: Into<StatusCode>>(status: T) -> Self
[src]
please use with_title
instead
pub fn with_title_and_type_from_status<T: Into<StatusCode>>(status: T) -> Self
[src]
please use with_title_and_type
instead
pub fn set_status<T: Into<StatusCode>>(self, status: T) -> Self
[src]
please use status
instead
pub fn set_title<T: Into<String>>(self, title: T) -> Self
[src]
please use title
instead
pub fn set_detail<T: Into<String>>(self, detail: T) -> Self
[src]
please use detail
instead
pub fn set_type_url<T: Into<String>>(self, type_url: T) -> Self
[src]
please use type_url
instead
pub fn set_instance<T: Into<String>>(self, instance: T) -> Self
[src]
please use instance
instead
Trait Implementations
impl Clone for HttpApiProblem
[src]
fn clone(&self) -> HttpApiProblem
[src]
pub fn clone_from(&mut self, source: &Self)
1.0.0[src]
impl Debug for HttpApiProblem
[src]
impl<'de> Deserialize<'de> for HttpApiProblem
[src]
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error> where
__D: Deserializer<'de>,
[src]
__D: Deserializer<'de>,
impl Display for HttpApiProblem
[src]
impl Error for HttpApiProblem
[src]
fn source(&self) -> Option<&(dyn Error + 'static)>
[src]
pub fn backtrace(&self) -> Option<&Backtrace>
[src]
pub fn description(&self) -> &str
1.0.0[src]
pub fn cause(&self) -> Option<&dyn Error>
1.0.0[src]
impl From<ApiError> for HttpApiProblem
[src]
impl From<StatusCode> for HttpApiProblem
[src]
fn from(status: StatusCode) -> HttpApiProblem
[src]
impl Reject for HttpApiProblem
[src]
impl Serialize for HttpApiProblem
[src]
Auto Trait Implementations
impl RefUnwindSafe for HttpApiProblem
impl Send for HttpApiProblem
impl Sync for HttpApiProblem
impl Unpin for HttpApiProblem
impl UnwindSafe for HttpApiProblem
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> DeserializeOwned for T where
T: for<'de> Deserialize<'de>,
[src]
T: for<'de> Deserialize<'de>,
impl<T> From<T> for T
[src]
impl<T> Instrument for T
[src]
pub fn instrument(self, span: Span) -> Instrumented<Self>
[src]
pub fn in_current_span(self) -> Instrumented<Self>
[src]
impl<T> Instrument for T
[src]
pub fn instrument(self, span: Span) -> Instrumented<Self>
[src]
pub fn in_current_span(self) -> Instrumented<Self>
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> Same<T> for T
type Output = T
Should always be Self
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn clone_into(&self, target: &mut T)
[src]
impl<T> ToString for T where
T: Display + ?Sized,
[src]
T: Display + ?Sized,
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
V: MultiLane<T>,
pub fn vzip(self) -> V
impl<T> WithSubscriber for T
[src]
pub fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
[src]
S: Into<Dispatch>,