pub struct RawRequest<'a> { /* private fields */ }Expand description
Основные paginator-ы и scope-типы блокирующего API. Блокирующие HTTP-клиенты ISS API. Универсальный builder для произвольных ISS endpoint-ов.
Служит low-level escape hatch для endpoint-ов, которые не покрыты строгим high-level 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?
153fn load_board_snapshots_all_pages(
154 moex_client: &Client,
155 engine: &str,
156 market: &str,
157 board: &str,
158) -> Result<Vec<SecuritySnapshot>, MoexError> {
159 let endpoint = format!("engines/{engine}/markets/{market}/boards/{board}/securities.json");
160 let mut start = 0_u32;
161 let mut snapshots = Vec::new();
162 let mut first_secid_on_previous_page = None;
163 let limit = BOARD_SNAPSHOTS_PAGE_LIMIT.to_string();
164
165 loop {
166 let payload = with_retry(retry_policy(), || {
167 moex_client
168 .raw()
169 .path(endpoint.as_str())
170 .only("securities,marketdata")
171 .columns("securities", "SECID,LOTSIZE")
172 .columns("marketdata", "SECID,LAST")
173 .param("start", start.to_string())
174 .param("limit", limit.as_str())
175 .send_payload()
176 })?;
177
178 let (page, first_secid_on_page) = parse_board_snapshots_page(&payload, endpoint.as_str())?;
179 if page.is_empty() {
180 break;
181 }
182
183 if let (Some(previous), Some(current)) =
184 (&first_secid_on_previous_page, &first_secid_on_page)
185 && previous == current
186 {
187 break;
188 }
189 first_secid_on_previous_page = first_secid_on_page;
190
191 let page_len = u32::try_from(page.len()).map_err(|_| MoexError::PaginationOverflow {
192 endpoint: endpoint.clone().into_boxed_str(),
193 start,
194 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
195 })?;
196
197 snapshots.extend(page);
198 if page_len < BOARD_SNAPSHOTS_PAGE_LIMIT {
199 break;
200 }
201 start = start
202 .checked_add(page_len)
203 .ok_or_else(|| MoexError::PaginationOverflow {
204 endpoint: endpoint.clone().into_boxed_str(),
205 start,
206 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
207 })?;
208 }
209
210 Ok(snapshots)
211}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?
153fn load_board_snapshots_all_pages(
154 moex_client: &Client,
155 engine: &str,
156 market: &str,
157 board: &str,
158) -> Result<Vec<SecuritySnapshot>, MoexError> {
159 let endpoint = format!("engines/{engine}/markets/{market}/boards/{board}/securities.json");
160 let mut start = 0_u32;
161 let mut snapshots = Vec::new();
162 let mut first_secid_on_previous_page = None;
163 let limit = BOARD_SNAPSHOTS_PAGE_LIMIT.to_string();
164
165 loop {
166 let payload = with_retry(retry_policy(), || {
167 moex_client
168 .raw()
169 .path(endpoint.as_str())
170 .only("securities,marketdata")
171 .columns("securities", "SECID,LOTSIZE")
172 .columns("marketdata", "SECID,LAST")
173 .param("start", start.to_string())
174 .param("limit", limit.as_str())
175 .send_payload()
176 })?;
177
178 let (page, first_secid_on_page) = parse_board_snapshots_page(&payload, endpoint.as_str())?;
179 if page.is_empty() {
180 break;
181 }
182
183 if let (Some(previous), Some(current)) =
184 (&first_secid_on_previous_page, &first_secid_on_page)
185 && previous == current
186 {
187 break;
188 }
189 first_secid_on_previous_page = first_secid_on_page;
190
191 let page_len = u32::try_from(page.len()).map_err(|_| MoexError::PaginationOverflow {
192 endpoint: endpoint.clone().into_boxed_str(),
193 start,
194 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
195 })?;
196
197 snapshots.extend(page);
198 if page_len < BOARD_SNAPSHOTS_PAGE_LIMIT {
199 break;
200 }
201 start = start
202 .checked_add(page_len)
203 .ok_or_else(|| MoexError::PaginationOverflow {
204 endpoint: endpoint.clone().into_boxed_str(),
205 start,
206 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
207 })?;
208 }
209
210 Ok(snapshots)
211}Sourcepub fn only(self, tables: impl Into<String>) -> Self
pub fn only(self, tables: impl Into<String>) -> Self
Добавить параметр iss.only.
Examples found in repository?
153fn load_board_snapshots_all_pages(
154 moex_client: &Client,
155 engine: &str,
156 market: &str,
157 board: &str,
158) -> Result<Vec<SecuritySnapshot>, MoexError> {
159 let endpoint = format!("engines/{engine}/markets/{market}/boards/{board}/securities.json");
160 let mut start = 0_u32;
161 let mut snapshots = Vec::new();
162 let mut first_secid_on_previous_page = None;
163 let limit = BOARD_SNAPSHOTS_PAGE_LIMIT.to_string();
164
165 loop {
166 let payload = with_retry(retry_policy(), || {
167 moex_client
168 .raw()
169 .path(endpoint.as_str())
170 .only("securities,marketdata")
171 .columns("securities", "SECID,LOTSIZE")
172 .columns("marketdata", "SECID,LAST")
173 .param("start", start.to_string())
174 .param("limit", limit.as_str())
175 .send_payload()
176 })?;
177
178 let (page, first_secid_on_page) = parse_board_snapshots_page(&payload, endpoint.as_str())?;
179 if page.is_empty() {
180 break;
181 }
182
183 if let (Some(previous), Some(current)) =
184 (&first_secid_on_previous_page, &first_secid_on_page)
185 && previous == current
186 {
187 break;
188 }
189 first_secid_on_previous_page = first_secid_on_page;
190
191 let page_len = u32::try_from(page.len()).map_err(|_| MoexError::PaginationOverflow {
192 endpoint: endpoint.clone().into_boxed_str(),
193 start,
194 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
195 })?;
196
197 snapshots.extend(page);
198 if page_len < BOARD_SNAPSHOTS_PAGE_LIMIT {
199 break;
200 }
201 start = start
202 .checked_add(page_len)
203 .ok_or_else(|| MoexError::PaginationOverflow {
204 endpoint: endpoint.clone().into_boxed_str(),
205 start,
206 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
207 })?;
208 }
209
210 Ok(snapshots)
211}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?
153fn load_board_snapshots_all_pages(
154 moex_client: &Client,
155 engine: &str,
156 market: &str,
157 board: &str,
158) -> Result<Vec<SecuritySnapshot>, MoexError> {
159 let endpoint = format!("engines/{engine}/markets/{market}/boards/{board}/securities.json");
160 let mut start = 0_u32;
161 let mut snapshots = Vec::new();
162 let mut first_secid_on_previous_page = None;
163 let limit = BOARD_SNAPSHOTS_PAGE_LIMIT.to_string();
164
165 loop {
166 let payload = with_retry(retry_policy(), || {
167 moex_client
168 .raw()
169 .path(endpoint.as_str())
170 .only("securities,marketdata")
171 .columns("securities", "SECID,LOTSIZE")
172 .columns("marketdata", "SECID,LAST")
173 .param("start", start.to_string())
174 .param("limit", limit.as_str())
175 .send_payload()
176 })?;
177
178 let (page, first_secid_on_page) = parse_board_snapshots_page(&payload, endpoint.as_str())?;
179 if page.is_empty() {
180 break;
181 }
182
183 if let (Some(previous), Some(current)) =
184 (&first_secid_on_previous_page, &first_secid_on_page)
185 && previous == current
186 {
187 break;
188 }
189 first_secid_on_previous_page = first_secid_on_page;
190
191 let page_len = u32::try_from(page.len()).map_err(|_| MoexError::PaginationOverflow {
192 endpoint: endpoint.clone().into_boxed_str(),
193 start,
194 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
195 })?;
196
197 snapshots.extend(page);
198 if page_len < BOARD_SNAPSHOTS_PAGE_LIMIT {
199 break;
200 }
201 start = start
202 .checked_add(page_len)
203 .ok_or_else(|| MoexError::PaginationOverflow {
204 endpoint: endpoint.clone().into_boxed_str(),
205 start,
206 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
207 })?;
208 }
209
210 Ok(snapshots)
211}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?
153fn load_board_snapshots_all_pages(
154 moex_client: &Client,
155 engine: &str,
156 market: &str,
157 board: &str,
158) -> Result<Vec<SecuritySnapshot>, MoexError> {
159 let endpoint = format!("engines/{engine}/markets/{market}/boards/{board}/securities.json");
160 let mut start = 0_u32;
161 let mut snapshots = Vec::new();
162 let mut first_secid_on_previous_page = None;
163 let limit = BOARD_SNAPSHOTS_PAGE_LIMIT.to_string();
164
165 loop {
166 let payload = with_retry(retry_policy(), || {
167 moex_client
168 .raw()
169 .path(endpoint.as_str())
170 .only("securities,marketdata")
171 .columns("securities", "SECID,LOTSIZE")
172 .columns("marketdata", "SECID,LAST")
173 .param("start", start.to_string())
174 .param("limit", limit.as_str())
175 .send_payload()
176 })?;
177
178 let (page, first_secid_on_page) = parse_board_snapshots_page(&payload, endpoint.as_str())?;
179 if page.is_empty() {
180 break;
181 }
182
183 if let (Some(previous), Some(current)) =
184 (&first_secid_on_previous_page, &first_secid_on_page)
185 && previous == current
186 {
187 break;
188 }
189 first_secid_on_previous_page = first_secid_on_page;
190
191 let page_len = u32::try_from(page.len()).map_err(|_| MoexError::PaginationOverflow {
192 endpoint: endpoint.clone().into_boxed_str(),
193 start,
194 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
195 })?;
196
197 snapshots.extend(page);
198 if page_len < BOARD_SNAPSHOTS_PAGE_LIMIT {
199 break;
200 }
201 start = start
202 .checked_add(page_len)
203 .ok_or_else(|| MoexError::PaginationOverflow {
204 endpoint: endpoint.clone().into_boxed_str(),
205 start,
206 limit: BOARD_SNAPSHOTS_PAGE_LIMIT,
207 })?;
208 }
209
210 Ok(snapshots)
211}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-таблицы в пользовательский тип.