pub struct RawTables { /* private fields */ }Expand description
Разобранные top-level блоки ISS payload-а для декодирования нескольких таблиц.
Позволяет один раз разобрать payload и затем извлекать таблицы через
RawTables::take_rows без повторного разбора всего JSON-документа.
Implementations§
Source§impl RawTables
impl RawTables
Sourcepub fn table_names(&self) -> impl Iterator<Item = &str>
pub fn table_names(&self) -> impl Iterator<Item = &str>
Имена top-level блоков payload-а.
Итератор отражает текущее состояние кэша: после take_rows(...)
соответствующее имя больше не возвращается.
Sourcepub fn take_rows<T>(
&mut self,
table: impl Into<String>,
) -> Result<Vec<T>, MoexError>where
T: DeserializeOwned,
pub fn take_rows<T>(
&mut self,
table: impl Into<String>,
) -> Result<Vec<T>, MoexError>where
T: DeserializeOwned,
Декодировать строки выбранной таблицы и удалить её из кэша.
Метод потребляет только выбранный top-level блок и не вызывает повторный разбор всего payload-а.
Examples found in repository?
examples/actual_indexes_dump.rs (line 218)
213fn parse_board_snapshots_page(
214 payload: &str,
215 endpoint: &str,
216) -> Result<(Vec<SecuritySnapshot>, Option<SecId>), MoexError> {
217 let mut tables = decode::raw_tables_json(payload, endpoint)?;
218 let security_rows: Vec<RawSecuritySnapshotRow> = tables.take_rows("securities")?;
219 let marketdata_rows: Vec<RawMarketdataSnapshotRow> = tables.take_rows("marketdata")?;
220
221 let mut marketdata_by_secid = HashMap::with_capacity(marketdata_rows.len());
222 for (row, marketdata) in marketdata_rows.into_iter().enumerate() {
223 marketdata_by_secid.insert(marketdata.secid, (row, marketdata.last));
224 }
225
226 let mut first_secid_on_page = None;
227 let mut snapshots = Vec::with_capacity(security_rows.len().max(marketdata_by_secid.len()));
228
229 for (row, security) in security_rows.into_iter().enumerate() {
230 let last = marketdata_by_secid
231 .remove(security.secid.as_str())
232 .and_then(|(_, last)| last);
233 let snapshot = SecuritySnapshot::try_new(security.secid, security.lot_size, last).map_err(
234 |source| MoexError::InvalidSecuritySnapshot {
235 endpoint: endpoint.to_owned().into_boxed_str(),
236 table: "securities",
237 row,
238 source,
239 },
240 )?;
241 if first_secid_on_page.is_none() {
242 first_secid_on_page = Some(snapshot.secid().clone());
243 }
244 snapshots.push(snapshot);
245 }
246
247 for (secid, (row, last)) in marketdata_by_secid {
248 let snapshot = SecuritySnapshot::try_new(secid, None, last).map_err(|source| {
249 MoexError::InvalidSecuritySnapshot {
250 endpoint: endpoint.to_owned().into_boxed_str(),
251 table: "marketdata",
252 row,
253 source,
254 }
255 })?;
256 if first_secid_on_page.is_none() {
257 first_secid_on_page = Some(snapshot.secid().clone());
258 }
259 snapshots.push(snapshot);
260 }
261
262 Ok((snapshots, first_secid_on_page))
263}Trait Implementations§
Auto Trait Implementations§
impl Freeze for RawTables
impl RefUnwindSafe for RawTables
impl Send for RawTables
impl Sync for RawTables
impl Unpin for RawTables
impl UnsafeUnpin for RawTables
impl UnwindSafe for RawTables
Blanket Implementations§
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
Mutably borrows from an owned value. Read more