#[non_exhaustive]pub enum MassiveError {
RateLimited {
retry_after: Option<Duration>,
},
Auth {
message: String,
},
Api {
status: u16,
message: String,
},
Http {
message: String,
},
Deserialize {
message: String,
payload: String,
},
EnvVar {
var: &'static str,
},
InvalidInput {
message: String,
},
PaginationLimitExceeded {
pages: usize,
limit: usize,
},
CyclicPagination {
url: String,
},
PaginationUrlTooLong {
len: usize,
limit: usize,
prefix: String,
},
UntrustedNextUrl {
next_url: String,
expected_origin: String,
},
}Expand description
Massive-specific errors.
The library returns these errors without automatic retry. Consumers decide how to handle rate limits and auth failures.
#[non_exhaustive]: new variants may be added without a major-version bump, so
downstream matches must include a wildcard arm.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
RateLimited
Rate limited by the API. Contains optional retry-after duration.
Returned on HTTP 429 responses. The consumer decides whether and when to retry.
Auth
Authentication failed.
Returned when:
- API key is invalid or expired
- API key lacks permission for the requested resource
Api
API returned an error response.
Covers non-auth, non-rate-limit API errors (invalid parameters, not found, etc.)
Http
Network or HTTP client error.
Deserialize
JSON deserialization failed.
EnvVar
Environment variable not set.
InvalidInput
Client-side input validation failed.
Returned when input parameters are invalid before making an API request (e.g., timestamp out of representable range).
PaginationLimitExceeded
A paginated fetch exceeded the maximum number of pages before the API reported the end of the result set.
Yielded as a terminal error on the affected stream. For a market-data
client a silent truncation is indistinguishable from a genuinely small
result set, so pagination fails loudly rather than returning a partial
Vec. Hitting this limit indicates either an unexpectedly large query or
a server that never signals the final page — inspect the query before
retrying.
CyclicPagination
A paginated fetch revisited a URL it had already fetched.
Yielded as a terminal error on the affected stream. A next_url that
points back to an already-visited page would otherwise loop forever;
detecting the cycle turns silent non-termination into an observable
failure.
PaginationUrlTooLong
A paginated fetch encountered a URL longer than the paginator will follow.
Yielded as a terminal error before the URL is recorded for cycle
detection or requested. A page’s next_url is server-controlled and
success bodies are read unbounded, so without this bound a misbehaving
origin could hand back arbitrarily long URLs — one retained per page, for
the life of the stream.
A real Massive cursor URL is a few hundred bytes, so hitting this indicates response tampering, a server-side bug, or (far less likely, but covered by the same check) a caller query that expands into an unreasonable first-page URL.
Fields
prefix: StringA bounded prefix of the rejected URL, for diagnosis. Unlike
UntrustedNextUrl::next_url this is
truncated by construction — retaining the value in full is the very
thing the variant exists to prevent.
Display marks the value as truncated only when
prefix is actually shorter than len, so a prefix that happens to
be complete does not render a misleading trailing ....
UntrustedNextUrl
A paginated fetch received a next_url outside the client’s configured
origin (scheme + host + port), or one that failed to parse as a URL.
Yielded as a terminal error before the request is issued. The client
attaches its API key as an Authorization: Bearer header only after this
origin check passes, so a next_url that names an unexpected origin is
rejected before the token is ever attached. A prefix check is insufficient
— a look-alike host such as https://api.massive.com.evil.example (or the
separator-less https://api.massive.comevil.example) shares the prefix
yet is a different origin — so origins are parsed and compared, and a
mismatched or unparseable next_url is rejected (fail-closed).
A well-behaved Massive API only ever returns a next_url under its own
origin (the path and cursor query differ; the origin is fixed). Hitting
this indicates a server-side bug, response tampering, or a misconfigured
base URL. Consumers may match on it to alert distinctly from ordinary
input-validation failures.
Trait Implementations§
Source§impl Clone for MassiveError
impl Clone for MassiveError
Source§impl Debug for MassiveError
impl Debug for MassiveError
Source§impl Display for MassiveError
impl Display for MassiveError
Source§impl Error for MassiveError
impl Error for MassiveError
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()
Source§impl From<Error> for MassiveError
impl From<Error> for MassiveError
Source§impl From<MassiveError> for DataError
impl From<MassiveError> for DataError
Source§fn from(err: MassiveError) -> Self
fn from(err: MassiveError) -> Self
Source§impl PartialEq for MassiveError
impl PartialEq for MassiveError
impl StructuralPartialEq for MassiveError
Auto Trait Implementations§
impl Freeze for MassiveError
impl RefUnwindSafe for MassiveError
impl Send for MassiveError
impl Sync for MassiveError
impl Unpin for MassiveError
impl UnsafeUnpin for MassiveError
impl UnwindSafe for MassiveError
Blanket Implementations§
Source§impl<T> AttachedTransformer<()> for T
impl<T> AttachedTransformer<()> for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreimpl<T> JsonSchemaMaybe for T
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.Source§impl<T> ToStringFallible for Twhere
T: Display,
impl<T> ToStringFallible for Twhere
T: Display,
Source§fn try_to_string(&self) -> Result<String, TryReserveError>
fn try_to_string(&self) -> Result<String, TryReserveError>
ToString::to_string, but without panic on OOM.