tonlib_core_anychain/cell/
util.rs

1use std::io;
2
3use bitstream_io::{BitRead, BitReader, Endianness};
4
5use crate::cell::{MapTonCellError, TonCellError};
6
7pub trait BitReadExt {
8    fn read_bits(&mut self, num_bits: usize, slice: &mut [u8]) -> Result<(), TonCellError>;
9}
10
11impl<R: io::Read, E: Endianness> BitReadExt for BitReader<R, E> {
12    fn read_bits(&mut self, num_bits: usize, slice: &mut [u8]) -> Result<(), TonCellError> {
13        let total_bytes = (num_bits + 7) / 8;
14        if total_bytes > slice.len() {
15            let msg = format!(
16                "Attempt to read {} bits into buffer {} bytes",
17                num_bits,
18                slice.len()
19            );
20            return Err(TonCellError::CellParserError(msg));
21        }
22        let full_bytes = (num_bits) / 8;
23        self.read_bytes(&mut slice[0..full_bytes])
24            .map_cell_parser_error()?;
25        let last_byte_len = num_bits % 8;
26        if last_byte_len != 0 {
27            let last_byte = self
28                .read::<u8>(last_byte_len as u32)
29                .map_cell_parser_error()?;
30            slice[full_bytes] = last_byte << (8 - last_byte_len);
31        }
32        Ok(())
33    }
34}