pub struct IbkrFlexClient { /* private fields */ }Expand description
Client for fetching corporate-action records from the IBKR Flex Web Service.
Debug omits both the token (a credential) and the reqwest::Client, so neither can leak.
Implementations§
Source§impl IbkrFlexClient
impl IbkrFlexClient
Sourcepub fn new(config: IbkrFlexConfig) -> Result<Self, IbkrFlexError>
pub fn new(config: IbkrFlexConfig) -> Result<Self, IbkrFlexError>
Create a client from a IbkrFlexConfig.
§Errors
Returns IbkrFlexError::Http if the underlying HTTP client cannot be built.
Sourcepub fn with_poll_policy(self, policy: FlexPollPolicy) -> Self
pub fn with_poll_policy(self, policy: FlexPollPolicy) -> Self
Override the GetStatement FlexPollPolicy (poll timing / budget).
Builder-style; defaults to FlexPollPolicy::default. Widen the budget for a large
statement (which takes longer to generate):
let _client = IbkrFlexClient::from_env()?.with_poll_policy(FlexPollPolicy {
initial_delay: Duration::from_secs(10),
interval: Duration::from_secs(10),
max_attempts: 30,
});Sourcepub fn from_env() -> Result<Self, IbkrFlexError>
pub fn from_env() -> Result<Self, IbkrFlexError>
Create a client from environment variables (see IbkrFlexConfig::from_env).
§Errors
Returns IbkrFlexError::EnvVar if a required variable is missing, or
IbkrFlexError::Http if the HTTP client cannot be built.
Sourcepub async fn fetch_statement_xml(&self) -> Result<String, IbkrFlexError>
pub async fn fetch_statement_xml(&self) -> Result<String, IbkrFlexError>
Run the full 2-call Flex flow and return the raw <FlexQueryResponse> statement XML.
Issues SendRequest, then polls GetStatement until the statement is ready, governed by this
client’s FlexPollPolicy (an initial_delay before the first poll, interval between
subsequent polls, and a max_attempts budget). Defaults to FlexPollPolicy::default;
override with with_poll_policy.
§Security
The Flex token is transmitted as the t= URL query parameter (as IBKR’s protocol
requires), so it is part of every request URL. Do not attach request-logging middleware to
the underlying reqwest::Client that records full URLs, or the token will be captured in
plaintext. The poll URL returned by SendRequest is required to be https:// for the same
reason — the token must never traverse an unencrypted connection.
For the same reason, IbkrFlexError::Http must never embed the request URL: a
reqwest::Error’s Display includes the URL it was building, which would carry t=<TOKEN>
into any log that formats the error. The From<reqwest::Error> conversion for
IbkrFlexError strips the URL via reqwest::Error::without_url before the error is
stored, so a plain ? is safe here and in any request path added later.
Two IBKR hosts are involved: ndcdyn.interactivebrokers.com (the hard-coded FLEX_BASE_URL
that serves SendRequest) and gdcdyn.interactivebrokers.com (the statement-download host
that SendRequest returns in its poll URL). The poll host is deliberately not pinned to
an allowlist — only its scheme is enforced (https://) — so IBKR can relocate statement
serving without breaking this client, while the https:// gate keeps the token encrypted
regardless of which host is returned.
§Errors
IbkrFlexError::Httpon a transport failure.IbkrFlexError::Flexif the service reports a terminal non-success status.IbkrFlexError::HttpStatusif a non-success HTTP status carries a body that is not a recognizable Flex envelope (e.g. a proxy/CDN error page).IbkrFlexError::PollTimeoutif the statement is still generating after the poll budget.IbkrFlexError::Parseif a response cannot be parsed.
Sourcepub async fn fetch_corporate_actions(
&self,
) -> Result<Vec<IbkrFlexCorporateAction>, IbkrFlexError>
pub async fn fetch_corporate_actions( &self, ) -> Result<Vec<IbkrFlexCorporateAction>, IbkrFlexError>
Fetch the statement and parse its Corporate Actions section into faithful records.
Convenience over fetch_statement_xml +
parse_corporate_actions. Returns all reorg rows; filtering to splits is the caller’s
job. See IbkrFlexCorporateAction for the record contract and limitations.
§Errors
Same as fetch_statement_xml.
Trait Implementations§
Source§impl Clone for IbkrFlexClient
impl Clone for IbkrFlexClient
Auto Trait Implementations§
impl !RefUnwindSafe for IbkrFlexClient
impl !UnwindSafe for IbkrFlexClient
impl Freeze for IbkrFlexClient
impl Send for IbkrFlexClient
impl Sync for IbkrFlexClient
impl Unpin for IbkrFlexClient
impl UnsafeUnpin for IbkrFlexClient
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.