Skip to main content

Error

Enum Error 

Source
pub enum Error {
    Unauthorized(ErrorBody),
    NotFound(ErrorBody),
    RateLimited {
        retry_after: Option<Duration>,
        body: ErrorBody,
    },
    Http {
        status: StatusCode,
        retry_after: Option<Duration>,
        body: ErrorBody,
    },
    Transport(Error),
    WebSocket(WebSocketError),
    Codec {
        context: String,
        reason: String,
    },
    InvalidPreference {
        field: &'static str,
        reason: String,
    },
    OrderIdUnrecoverable(String),
    OrderResponseNotRepresentable {
        reason: String,
    },
    TokenProvider {
        source: Box<dyn Error + Send + Sync>,
    },
    InsecureBaseUrl {
        url: String,
        reason: String,
    },
}
Expand description

Error returned by every fallible operation in this crate.

Variants§

§

Unauthorized(ErrorBody)

HTTP 401. Distinct from Error::Http so a future token-refresh seam in SchwabClient has a single arm to hook.

§

NotFound(ErrorBody)

HTTP 404. Distinct from Error::Http because callers idiomatically map “broker says no such resource” to Ok(None).

§

RateLimited

429 with optional Retry-After.

Fields

§retry_after: Option<Duration>

Parsed Retry-After header value, if Schwab sent one.

§body: ErrorBody

Decoded response body.

§

Http

Any other non-2xx response. The status is authoritative; the body is supplementary. retry_after carries the parsed Retry-After header when the server sent one (the spec allows it on any 4xx / 5xx, not only 429); callers can read it via Error::retry_after without matching on the variant.

Fields

§status: StatusCode

HTTP status from the response.

§retry_after: Option<Duration>

Parsed Retry-After header value, if the server sent one.

§body: ErrorBody

Decoded response body.

§

Transport(Error)

reqwest transport failure (DNS, connect, TLS, body read).

§

WebSocket(WebSocketError)

Streamer websocket: connect, handshake, or runtime frame error.

§

Codec

JSON serde failure on a wire body or streamer frame. context names the operation (e.g. "decode CHART_EQUITY frame", "encode subscribe request").

Fields

§context: String

Names the operation that failed (e.g. "decode response body").

§reason: String

Underlying serde error message.

§

InvalidPreference

/userPreference response missing a required field or carrying an unparseable value.

Fields

§field: &'static str

Name of the missing or unparseable field.

§reason: String

Why the field was rejected (e.g. "missing", parse error text).

§

OrderIdUnrecoverable(String)

Schwab acked a place / replace order but the Location header was absent or malformed, so the new order’s id is unrecoverable.

§

OrderResponseNotRepresentable

An crate::orders::Order returned by a read endpoint could not be converted into an crate::orders::OrderRequest for a follow-up place or replace call. The carried reason names the specific shape mismatch (e.g. a leg missing its instrument, an instrument missing its symbol, an unknown assetType). This variant is not retryable: the response will not change on a retry.

Fields

§reason: String

What in the response prevented the conversion.

§

TokenProvider

A crate::TokenProvider failed to produce a bearer token, so no HTTP request could be issued. The wrapped source is the provider’s own error type, type-erased; the SDK has no opinion on whether it is transient.

Fields

§source: Box<dyn Error + Send + Sync>

Underlying provider error, type-erased.

§

InsecureBaseUrl

A base URL passed to crate::SchwabClient::with_trader_base_url or crate::SchwabClient::with_market_data_base_url used a scheme that is not permitted for the current build. Release builds require https://; debug builds additionally permit http:// so local fixture servers (wiremock and similar) can be wired up in tests.

Fields

§url: String

The rejected URL string.

§reason: String

Why the URL was rejected.

Implementations§

Source§

impl Error

Source

pub fn is_retryable(&self) -> bool

Schwab-specific retry classification. Returns true for transient failures (network, 5xx, 429) where the same request can be safely retried by the caller. Returns false for terminal failures (4xx other than 429, codec errors, preference / location errors).

schwab-sdk does not implement retry itself; this method exists so downstream consumers can utilize it in their own retry logic.

§Examples

A minimal backoff loop honoring Self::retry_after when present. In real code a crate such as backon is preferable; this shows the seam.

use std::time::Duration;
use schwab_sdk::Result;

async fn with_retry<F, Fut, T>(mut op: F) -> Result<T>
where
    F: FnMut() -> Fut,
    Fut: std::future::Future<Output = Result<T>>,
{
    let mut attempts = 0;
    loop {
        match op().await {
            Ok(value) => return Ok(value),
            Err(err) if err.is_retryable() && attempts < 3 => {
                attempts += 1;
                let delay = err.retry_after().unwrap_or(Duration::from_millis(500));
                tokio::time::sleep(delay).await;
            }
            Err(err) => return Err(err),
        }
    }
}

let quotes = with_retry(|| client.market_data().quotes().list(["AAPL"]).send()).await?;
Source

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

Retry-After duration parsed from a non-2xx response, when the server sent the header. None for variants that do not carry HTTP status (transport, codec, etc.) or when the header was absent. Surfaces on both Error::RateLimited (429) and Error::Http (any other 4xx / 5xx Schwab annotated with Retry-After, typically 503).

Trait Implementations§

Source§

impl Debug for Error

Source§

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

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

impl Display for Error

Source§

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

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

impl Error for Error

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<Error> for Error

Source§

fn from(source: Error) -> Self

Converts to this type from the input type.
Source§

impl From<WebSocketError> for Error

Source§

fn from(source: WebSocketError) -> Self

Converts to this type from the input type.
Source§

impl From<WebSocketError> for Error

Source§

fn from(value: WebSocketError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl Freeze for Error

§

impl !RefUnwindSafe for Error

§

impl Send for Error

§

impl Sync for Error

§

impl Unpin for Error

§

impl UnsafeUnpin for Error

§

impl !UnwindSafe for Error

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<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> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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 = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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