hadris-optical 2.1.0

Hadris facade for optical filesystems and disc images
Documentation
#![cfg(all(feature = "open", feature = "sync", feature = "cd"))]

use hadris_optical::{OpenPolicy, OpticalFormat, sync::OpenOpticalImage};

fn create_image(options: hadris_optical::cd::OpticalImageOptions) -> std::io::Cursor<Vec<u8>> {
    let mut image = std::io::Cursor::new(vec![0_u8; 4 * 1024 * 1024]);
    hadris_optical::cd::OpticalImageWriter::new(
        hadris_io::sync::Borrowed::new(&mut image),
        options,
    )
    .finish(hadris_optical::cd::FileTree::new())
    .unwrap();
    image
}

fn create_udf_image() -> std::io::Cursor<Vec<u8>> {
    use hadris_optical::udf::sync::write::{SimpleDir, UdfWriteOptions, UdfWriter};

    let mut image = std::io::Cursor::new(vec![0_u8; 4 * 1024 * 1024]);
    UdfWriter::create(
        hadris_io::sync::Borrowed::new(&mut image),
        &SimpleDir::root(),
        UdfWriteOptions::default(),
    )
    .unwrap();
    image
}

#[test]
fn opens_single_format_images_and_recovers_source() {
    let cases = [
        (
            create_image(hadris_optical::cd::OpticalImageOptions::default().iso_only()),
            OpticalFormat::Iso9660,
        ),
        (create_udf_image(), OpticalFormat::Udf),
    ];
    for (mut source, expected) in cases {
        let opened = OpenOpticalImage::open(&mut source, OpenPolicy::default()).unwrap();
        assert_eq!(opened.format(), expected);
        let source = opened.into_inner();
        assert!(!source.get_ref().is_empty());
    }
}

#[test]
fn exact_requests_are_checked() {
    let mut iso = create_image(hadris_optical::cd::OpticalImageOptions::default().iso_only());
    let error = match OpenOpticalImage::open(&mut iso, OpenPolicy::Udf) {
        Ok(_) => panic!("ISO-only image unexpectedly opened as UDF"),
        Err(error) => error,
    };
    assert!(matches!(
        error,
        hadris_optical::Error::RequestedFormatUnavailable(OpticalFormat::Udf)
    ));
}

#[test]
fn bridge_image_opens_as_either_filesystem() {
    let mut source = create_image(hadris_optical::cd::OpticalImageOptions::default());
    let opened = OpenOpticalImage::open(&mut source, OpenPolicy::Udf).unwrap();
    assert_eq!(opened.format(), OpticalFormat::Udf);
    let source = opened.into_inner();

    let opened = OpenOpticalImage::open(source, OpenPolicy::Iso9660).unwrap();
    assert_eq!(opened.format(), OpticalFormat::Iso9660);
    let _ = opened.into_inner();
}