lzfse_rust/decode/
probe.rs

1use crate::base::MagicBytes;
2use crate::error::Error;
3use crate::fse;
4use crate::ops::{PeekData, Skip};
5use crate::raw;
6use crate::vn;
7
8use std::convert::TryInto;
9
10#[allow(dead_code)]
11pub fn probe(mut src: &[u8]) -> crate::Result<u64> {
12    let mut t_raw_bytes: u64 = 0;
13    loop {
14        if src.len() < 4 {
15            return Err(Error::PayloadUnderflow);
16        }
17        let magic_bytes: MagicBytes = src.peek_u32().try_into()?;
18        let (n_payload_bytes, n_raw_bytes) = match magic_bytes {
19            MagicBytes::Vx1 => fse::v1_probe(src)?,
20            MagicBytes::Vx2 => fse::v2_probe(src)?,
21            MagicBytes::Vxn => vn::vn_probe(src)?,
22            MagicBytes::Raw => raw::raw_probe(src)?,
23            MagicBytes::Eos => break,
24        };
25        if n_payload_bytes as usize >= src.len() {
26            return Err(Error::PayloadUnderflow);
27        }
28        src.skip(n_payload_bytes as usize);
29        t_raw_bytes += n_raw_bytes as u64;
30    }
31    if src.len() != 4 {
32        return Err(Error::PayloadOverflow);
33    }
34    Ok(t_raw_bytes)
35}