rc-zip 5.3.6

An I/O-agnostic implementation of the zip file format
Documentation
#[test]
#[cfg_attr(not(feature = "corpus"), ignore = "needs 'corpus' feature")]
fn state_machine() {
    #[cfg(not(feature = "corpus"))]
    {
        panic!("needs 'corpus' feature");
    }
    #[cfg(feature = "corpus")]
    {
        use std::cmp;

        use rc_zip::{
            corpus,
            fsm::{ArchiveFsm, FsmResult},
        };

        corpus::install_test_subscriber();

        let cases = corpus::test_cases();
        let case = cases.iter().find(|x| x.name == "zip64.zip").unwrap();
        let bytes = case.bytes();

        let mut fsm = ArchiveFsm::new(bytes.len() as u64);

        let archive = 'read_zip: loop {
            if let Some(offset) = fsm.wants_read() {
                let increment = 128usize;
                let offset = offset as usize;
                let slice = if offset + increment > bytes.len() {
                    &bytes[offset..]
                } else {
                    &bytes[offset..offset + increment]
                };

                let len = cmp::min(slice.len(), fsm.space().len());
                fsm.space()[..len].copy_from_slice(&slice[..len]);
                match len {
                    0 => panic!("EOF!"),
                    read_bytes => {
                        fsm.fill(read_bytes);
                    }
                }
            }

            fsm = match fsm.process() {
                Ok(res) => match res {
                    FsmResult::Continue(fsm) => fsm,
                    FsmResult::Done(archive) => break 'read_zip archive,
                },
                Err(err) => {
                    panic!("{}", err)
                }
            }
        };

        // cool, we have the archive
        let _ = archive;
    }
}