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) -> &str1.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>,