pub struct RawRequest<'a> { /* private fields */ }Expand description
Основные пагинаторы и типы контекстов блокирующего API. Блокирующие HTTP-клиенты ISS API. Универсальный builder для произвольных ISS endpoint-ов.
Нужен как низкоуровневый путь для endpoint-ов, которые пока не покрыты строгим типизированным API.
Implementations§
Source§impl<'a> RawIssRequestBuilder<'a>
impl<'a> RawIssRequestBuilder<'a>
Sourcepub fn path(self, path: impl Into<String>) -> Self
pub fn path(self, path: impl Into<String>) -> Self
Установить endpoint-path относительно /iss/.
Допускаются формы:
enginesengines.json/iss/engines
Examples found in repository?
169fn load_board_snapshots_all_pages(
170 moex_client: &Client,
171 engine: &str,
172 market: &str,
173 board: &str,
174) -> Result<Vec<SecuritySnapshot>, MoexError> {
175 let endpoint = format!("engines/{engine}/markets/{market}/boards/{board}/securities.json");
176 let mut start = 0_u32;
177 let mut snapshots = Vec::new();
178 let mut first_secid_on_previous_page = None;
179 let limit = BOARD_SNAPSHOTS_PAGE_LIMIT.to_string();
180
181 loop {
182 let payload = with_retry(retry_policy(), || {
183 moex_client
184 .raw()
185 .path(endpoint.as_str())
186 .only("securities,marketdata")
187 .columns("securities", "SECID,LOTSIZE")
188 .columns("marketdata", "SECID,LAST")
189 .param("start", start.to_string())
190 .param("limit", limit.as_str())
191 .send_payload()
192 })?;
193
194 let (page, first_secid_on_page) = parse_board_snapshots_page(&payload, endpoint.as_str())?;
195 if page.is_empty() {
196 break;
197 }
198
199 if let (Some(previous), Some(current)) =
200 (&first_secid_on_previous_page, &first_secid_on_page)
201 && previous == current
202 {
203 break;
204 }
205 first_secid_on_previous_page = first_secid_on_page;
206
207 let page_len = u32::try_from(page.len()).map_err(|_| MoexError::PaginationOverflow {
208 endpoint: endpoint.clone().into_boxed_str(),
209 start,
210 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
211 })?;
212
213 snapshots.extend(page);
214 if page_len < BOARD_SNAPSHOTS_PAGE_LIMIT {
215 break;
216 }
217 start = start
218 .checked_add(page_len)
219 .ok_or_else(|| MoexError::PaginationOverflow {
220 endpoint: endpoint.clone().into_boxed_str(),
221 start,
222 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
223 })?;
224 }
225
226 Ok(snapshots)
227}Sourcepub fn param(self, key: impl Into<String>, value: impl Into<String>) -> Self
pub fn param(self, key: impl Into<String>, value: impl Into<String>) -> Self
Добавить query-параметр.
Examples found in repository?
169fn load_board_snapshots_all_pages(
170 moex_client: &Client,
171 engine: &str,
172 market: &str,
173 board: &str,
174) -> Result<Vec<SecuritySnapshot>, MoexError> {
175 let endpoint = format!("engines/{engine}/markets/{market}/boards/{board}/securities.json");
176 let mut start = 0_u32;
177 let mut snapshots = Vec::new();
178 let mut first_secid_on_previous_page = None;
179 let limit = BOARD_SNAPSHOTS_PAGE_LIMIT.to_string();
180
181 loop {
182 let payload = with_retry(retry_policy(), || {
183 moex_client
184 .raw()
185 .path(endpoint.as_str())
186 .only("securities,marketdata")
187 .columns("securities", "SECID,LOTSIZE")
188 .columns("marketdata", "SECID,LAST")
189 .param("start", start.to_string())
190 .param("limit", limit.as_str())
191 .send_payload()
192 })?;
193
194 let (page, first_secid_on_page) = parse_board_snapshots_page(&payload, endpoint.as_str())?;
195 if page.is_empty() {
196 break;
197 }
198
199 if let (Some(previous), Some(current)) =
200 (&first_secid_on_previous_page, &first_secid_on_page)
201 && previous == current
202 {
203 break;
204 }
205 first_secid_on_previous_page = first_secid_on_page;
206
207 let page_len = u32::try_from(page.len()).map_err(|_| MoexError::PaginationOverflow {
208 endpoint: endpoint.clone().into_boxed_str(),
209 start,
210 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
211 })?;
212
213 snapshots.extend(page);
214 if page_len < BOARD_SNAPSHOTS_PAGE_LIMIT {
215 break;
216 }
217 start = start
218 .checked_add(page_len)
219 .ok_or_else(|| MoexError::PaginationOverflow {
220 endpoint: endpoint.clone().into_boxed_str(),
221 start,
222 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
223 })?;
224 }
225
226 Ok(snapshots)
227}Sourcepub fn only(self, tables: impl Into<String>) -> Self
pub fn only(self, tables: impl Into<String>) -> Self
Добавить параметр iss.only.
Examples found in repository?
169fn load_board_snapshots_all_pages(
170 moex_client: &Client,
171 engine: &str,
172 market: &str,
173 board: &str,
174) -> Result<Vec<SecuritySnapshot>, MoexError> {
175 let endpoint = format!("engines/{engine}/markets/{market}/boards/{board}/securities.json");
176 let mut start = 0_u32;
177 let mut snapshots = Vec::new();
178 let mut first_secid_on_previous_page = None;
179 let limit = BOARD_SNAPSHOTS_PAGE_LIMIT.to_string();
180
181 loop {
182 let payload = with_retry(retry_policy(), || {
183 moex_client
184 .raw()
185 .path(endpoint.as_str())
186 .only("securities,marketdata")
187 .columns("securities", "SECID,LOTSIZE")
188 .columns("marketdata", "SECID,LAST")
189 .param("start", start.to_string())
190 .param("limit", limit.as_str())
191 .send_payload()
192 })?;
193
194 let (page, first_secid_on_page) = parse_board_snapshots_page(&payload, endpoint.as_str())?;
195 if page.is_empty() {
196 break;
197 }
198
199 if let (Some(previous), Some(current)) =
200 (&first_secid_on_previous_page, &first_secid_on_page)
201 && previous == current
202 {
203 break;
204 }
205 first_secid_on_previous_page = first_secid_on_page;
206
207 let page_len = u32::try_from(page.len()).map_err(|_| MoexError::PaginationOverflow {
208 endpoint: endpoint.clone().into_boxed_str(),
209 start,
210 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
211 })?;
212
213 snapshots.extend(page);
214 if page_len < BOARD_SNAPSHOTS_PAGE_LIMIT {
215 break;
216 }
217 start = start
218 .checked_add(page_len)
219 .ok_or_else(|| MoexError::PaginationOverflow {
220 endpoint: endpoint.clone().into_boxed_str(),
221 start,
222 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
223 })?;
224 }
225
226 Ok(snapshots)
227}Sourcepub fn columns(
self,
table: impl Into<String>,
columns: impl Into<String>,
) -> Self
pub fn columns( self, table: impl Into<String>, columns: impl Into<String>, ) -> Self
Добавить параметр <table>.columns.
Examples found in repository?
169fn load_board_snapshots_all_pages(
170 moex_client: &Client,
171 engine: &str,
172 market: &str,
173 board: &str,
174) -> Result<Vec<SecuritySnapshot>, MoexError> {
175 let endpoint = format!("engines/{engine}/markets/{market}/boards/{board}/securities.json");
176 let mut start = 0_u32;
177 let mut snapshots = Vec::new();
178 let mut first_secid_on_previous_page = None;
179 let limit = BOARD_SNAPSHOTS_PAGE_LIMIT.to_string();
180
181 loop {
182 let payload = with_retry(retry_policy(), || {
183 moex_client
184 .raw()
185 .path(endpoint.as_str())
186 .only("securities,marketdata")
187 .columns("securities", "SECID,LOTSIZE")
188 .columns("marketdata", "SECID,LAST")
189 .param("start", start.to_string())
190 .param("limit", limit.as_str())
191 .send_payload()
192 })?;
193
194 let (page, first_secid_on_page) = parse_board_snapshots_page(&payload, endpoint.as_str())?;
195 if page.is_empty() {
196 break;
197 }
198
199 if let (Some(previous), Some(current)) =
200 (&first_secid_on_previous_page, &first_secid_on_page)
201 && previous == current
202 {
203 break;
204 }
205 first_secid_on_previous_page = first_secid_on_page;
206
207 let page_len = u32::try_from(page.len()).map_err(|_| MoexError::PaginationOverflow {
208 endpoint: endpoint.clone().into_boxed_str(),
209 start,
210 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
211 })?;
212
213 snapshots.extend(page);
214 if page_len < BOARD_SNAPSHOTS_PAGE_LIMIT {
215 break;
216 }
217 start = start
218 .checked_add(page_len)
219 .ok_or_else(|| MoexError::PaginationOverflow {
220 endpoint: endpoint.clone().into_boxed_str(),
221 start,
222 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
223 })?;
224 }
225
226 Ok(snapshots)
227}Sourcepub fn metadata(self, metadata: IssToggle) -> Self
pub fn metadata(self, metadata: IssToggle) -> Self
Явно задать iss.meta для текущего raw-запроса.
Sourcepub fn options(self, options: IssRequestOptions) -> Self
pub fn options(self, options: IssRequestOptions) -> Self
Применить пакет системных iss.*-опций.
Sourcepub fn send_response(self) -> Result<RawIssResponse, MoexError>
pub fn send_response(self) -> Result<RawIssResponse, MoexError>
Выполнить raw-запрос и вернуть полный HTTP-ответ.
В отличие от send_payload, метод не проверяет 2xx и JSON-формат.
Sourcepub fn send_payload(self) -> Result<String, MoexError>
pub fn send_payload(self) -> Result<String, MoexError>
Выполнить raw-запрос и вернуть тело ответа как строку.
Examples found in repository?
169fn load_board_snapshots_all_pages(
170 moex_client: &Client,
171 engine: &str,
172 market: &str,
173 board: &str,
174) -> Result<Vec<SecuritySnapshot>, MoexError> {
175 let endpoint = format!("engines/{engine}/markets/{market}/boards/{board}/securities.json");
176 let mut start = 0_u32;
177 let mut snapshots = Vec::new();
178 let mut first_secid_on_previous_page = None;
179 let limit = BOARD_SNAPSHOTS_PAGE_LIMIT.to_string();
180
181 loop {
182 let payload = with_retry(retry_policy(), || {
183 moex_client
184 .raw()
185 .path(endpoint.as_str())
186 .only("securities,marketdata")
187 .columns("securities", "SECID,LOTSIZE")
188 .columns("marketdata", "SECID,LAST")
189 .param("start", start.to_string())
190 .param("limit", limit.as_str())
191 .send_payload()
192 })?;
193
194 let (page, first_secid_on_page) = parse_board_snapshots_page(&payload, endpoint.as_str())?;
195 if page.is_empty() {
196 break;
197 }
198
199 if let (Some(previous), Some(current)) =
200 (&first_secid_on_previous_page, &first_secid_on_page)
201 && previous == current
202 {
203 break;
204 }
205 first_secid_on_previous_page = first_secid_on_page;
206
207 let page_len = u32::try_from(page.len()).map_err(|_| MoexError::PaginationOverflow {
208 endpoint: endpoint.clone().into_boxed_str(),
209 start,
210 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
211 })?;
212
213 snapshots.extend(page);
214 if page_len < BOARD_SNAPSHOTS_PAGE_LIMIT {
215 break;
216 }
217 start = start
218 .checked_add(page_len)
219 .ok_or_else(|| MoexError::PaginationOverflow {
220 endpoint: endpoint.clone().into_boxed_str(),
221 start,
222 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
223 })?;
224 }
225
226 Ok(snapshots)
227}Sourcepub fn send_json<T>(self) -> Result<T, MoexError>where
T: DeserializeOwned,
pub fn send_json<T>(self) -> Result<T, MoexError>where
T: DeserializeOwned,
Выполнить raw-запрос и декодировать JSON в пользовательский тип.
Sourcepub fn send_table<T>(
self,
table: impl Into<String>,
) -> Result<Vec<T>, MoexError>where
T: DeserializeOwned,
pub fn send_table<T>(
self,
table: impl Into<String>,
) -> Result<Vec<T>, MoexError>where
T: DeserializeOwned,
Выполнить raw-запрос и декодировать строки выбранной ISS-таблицы в пользовательский тип.