Skip to main content

ApiError

Struct ApiError 

Source
pub struct ApiError { /* private fields */ }
Expand description

An unsuccessful HTTP response, with the body and metadata it came with.

Reach it through ErrorKind::Api.

Implementations§

Source§

impl ApiError

Source

pub fn status(&self) -> StatusCode

The response status.

Source

pub fn kind(&self) -> ApiErrorKind

Which class of failure the status puts this response in.

Source

pub fn headers(&self) -> &HeaderMap

The response headers, as they arrived.

Source

pub fn request_id(&self) -> Option<&str>

The server’s identifier for this request, from x-typesafe-request-id.

None when the header is absent or is not text. This is the header’s text exactly as it arrived; Display and Debug show it escaped and cut at 128 characters instead.

Source

pub fn endpoint(&self) -> Option<&str>

The method and URL the request went to, without credentials, query or fragment, as GET https://api.typesafe.ai/v1/models.

None when the failure was built without a request to name.

Source

pub fn message(&self) -> &str

The sentence the server gave for this failure.

It is read from the body at the first of these that holds a string: error, error.message, message, detail, detail.message, or a list under detail whose entries are joined with ; as <loc>: <msg>. Failing all of those, it is the body itself, compacted when it is JSON; an empty body, or a body that is the JSON null, gives status code (no body).

Whichever part of the body it came from, the text is the server’s, so it is made safe to print: a control character, or a format character that reorders or hides the text around it, is written as a Rust escape (\n, \u{1b}), and the text is cut at 200 characters, counted after escaping, and marked with U+2026. The Python SDK keeps a member’s text as the server sent it and cuts only a body standing in for a message; here every path is cut, so a server cannot break, recolour or flood the log line of a caller that prints the error. body_text still returns every byte.

It can be empty, which is how a caller-supplied empty message survives to Display, where the status then stands alone.

Source

pub fn error_type(&self) -> Option<&str>

The server’s machine-readable name for this failure, from detail.error_type.

The live API answers a request with no key with 403 and authentication_error here, which is the only way to tell that case apart from a key that exists and lacks a permission.

This is the server’s text as it arrived, for a caller to compare. It is never part of Display; Debug shows it escaped and cut at 128 characters, as it does the request id.

Source

pub fn body(&self) -> &[u8]

The response body, exactly as it arrived.

Source

pub fn body_text(&self) -> Cow<'_, str>

The response body as text, with anything that is not UTF-8 replaced by U+FFFD.

Source

pub fn body_json<'de, T>(&'de self) -> Result<T, DecodeError>
where T: Deserialize<'de>,

The response body, decoded as JSON.

§Errors

Returns a DecodeError when the body is not JSON, is nested deeper than this crate’s limit, or does not fit T.

Source

pub fn retry_after(&self) -> Option<Duration>

How long the server asked the caller to wait, from retry-after-ms or Retry-After.

Read for any status, not only 429: a 503 may carry the same headers. Reads the system clock, because Retry-After may be an HTTP date.

Trait Implementations§

Source§

impl Clone for ApiError

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for ApiError

Source§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result

Prints what identifies the failure, and nothing that could be a secret.

The headers are reduced to their count and the body to its length: a response carries back whatever the request sent under Authorization or a cookie in some proxy configurations, and a Debug that is printed into a log must not be the thing that puts it there.

Source§

impl Display for ApiError

Source§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Error for ApiError

1.30.0 · Source§

fn source(&self) -> Option<&(dyn Error + 'static)>

Returns the lower-level source of this error, if any. Read more
1.0.0 · Source§

fn description(&self) -> &str

👎Deprecated since 1.42.0:

use the Display impl or to_string()

1.0.0 · Source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

Source§

fn provide<'a>(&'a self, request: &mut Request<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type-based access to context intended for error reports. Read more
Source§

impl From<ApiError> for Error

Source§

fn from(error: ApiError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> ToCompactString for T
where T: Display,

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more