lzfse_rust/decode/
probe.rs1use 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}