pub struct RawTables { /* private fields */ }Expand description
Разобранные верхнеуровневые блоки 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>
Имена верхнеуровневых блоков payload-а.
Итератор отражает текущее состояние кэша: после take_rows(...)
соответствующее имя больше не возвращается.
Sourcepub fn take_rows<T>(
&mut self,
table: impl AsRef<str>,
) -> Result<Vec<T>, MoexError>where
T: DeserializeOwned,
pub fn take_rows<T>(
&mut self,
table: impl AsRef<str>,
) -> Result<Vec<T>, MoexError>where
T: DeserializeOwned,
Декодировать строки выбранной таблицы и удалить её из кэша.
Метод потребляет только выбранный верхнеуровневый блок и не вызывает повторный разбор всего payload-а.
Examples found in repository?
examples/actual_indexes_dump.rs (line 234)
229fn parse_board_snapshots_page(
230 payload: &str,
231 endpoint: &str,
232) -> Result<(Vec<SecuritySnapshot>, Option<SecId>), MoexError> {
233 let mut tables = decode::raw_tables_json(payload, endpoint)?;
234 let security_rows: Vec<RawSecuritySnapshotRow> = tables.take_rows("securities")?;
235 let marketdata_rows: Vec<RawMarketdataSnapshotRow> = tables.take_rows("marketdata")?;
236
237 let mut marketdata_by_secid = HashMap::with_capacity(marketdata_rows.len());
238 for (row, marketdata) in marketdata_rows.into_iter().enumerate() {
239 marketdata_by_secid.insert(marketdata.secid, (row, marketdata.last));
240 }
241
242 let mut first_secid_on_page = None;
243 let mut snapshots = Vec::with_capacity(security_rows.len().max(marketdata_by_secid.len()));
244
245 for (row, security) in security_rows.into_iter().enumerate() {
246 let last = marketdata_by_secid
247 .remove(security.secid.as_str())
248 .and_then(|(_, last)| last);
249 let snapshot = SecuritySnapshot::try_new(security.secid, security.lot_size, last).map_err(
250 |source| MoexError::InvalidSecuritySnapshot {
251 endpoint: endpoint.to_owned().into_boxed_str(),
252 table: "securities",
253 row,
254 source,
255 },
256 )?;
257 if first_secid_on_page.is_none() {
258 first_secid_on_page = Some(snapshot.secid().clone());
259 }
260 snapshots.push(snapshot);
261 }
262
263 for (secid, (row, last)) in marketdata_by_secid {
264 let snapshot = SecuritySnapshot::try_new(secid, None, last).map_err(|source| {
265 MoexError::InvalidSecuritySnapshot {
266 endpoint: endpoint.to_owned().into_boxed_str(),
267 table: "marketdata",
268 row,
269 source,
270 }
271 })?;
272 if first_secid_on_page.is_none() {
273 first_secid_on_page = Some(snapshot.secid().clone());
274 }
275 snapshots.push(snapshot);
276 }
277
278 Ok((snapshots, first_secid_on_page))
279}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