libczirw-sys 0.5.1

Wrapper around libCZIAPI
Documentation
extern crate link_cplusplus;

pub mod error;
mod functions;
mod handle;
mod interop;
mod misc;
pub mod sys;

pub use functions::*;
pub use handle::*;
pub use interop::*;
pub use misc::{AttachmentData, Dimension, PixelType, RawDataType};

#[cfg(test)]
mod tests {
    use crate::handle::{CziReader, InputStream};
    use crate::interop::{LibCZIBuildInformation, ReaderOpenInfo};
    use crate::misc::Dimension;
    use std::path::{Path, PathBuf};

    #[test]
    fn test_read_shape() -> Result<(), Box<dyn std::error::Error>> {
        let path = Path::new("test-files/Experiment-2029.czi");
        assert!(path.exists());
        let czi = CziReader::create()?;
        let stream = InputStream::create_from_file_utf8(path.to_string_lossy().as_ref())?;
        let open_info = ReaderOpenInfo::new(&stream);
        czi.open(open_info)?;
        println!("pyramid statistics: {:?}", czi.get_pyramid_statistics()?);
        println!("file header info: {:?}", czi.get_file_header_info()?);
        let statistics_simple = czi.get_statistics_simple()?;
        println!("statistics simple: {:?}", czi.get_statistics_simple()?);
        let bounding_box = statistics_simple.get_bounding_box();
        let dim_bounds = statistics_simple.get_dim_bounds();
        let dimensions = Dimension::vec_from_bitflags(dim_bounds.get_dimensions_valid());
        let size = dim_bounds.get_size();
        for (i, d) in dimensions.iter().enumerate() {
            println!("{:?}: {}", d, size[i]);
        }
        assert_eq!(bounding_box.get_w(), 1280);
        assert_eq!(bounding_box.get_h(), 1280);
        Ok(())
    }

    #[test]
    fn test_read_bytes() -> Result<(), Box<dyn std::error::Error>> {
        let path = Path::new("test-files/Experiment-2029.czi");
        assert!(path.exists());
        let czi = CziReader::create()?;
        let stream = InputStream::create_from_file_utf8(path.to_string_lossy().as_ref())?;
        let open_info = ReaderOpenInfo::new(&stream);
        czi.open(open_info)?;
        let sub_block = czi.read_sub_block(0)?;
        let bitmap = sub_block.create_bitmap()?.lock()?;
        let bitmap_info = bitmap.get_info()?;
        println!(
            "height: {}, width: {} pixel type: {:#?}",
            bitmap_info.get_height(),
            bitmap_info.get_width(),
            bitmap_info.get_pixel_type()?
        );
        let bytes = bitmap.lock_info.get_data_roi();
        println!("bytes: {:?}", bytes.as_slice()[..100].to_vec());
        assert_eq!(
            bytes.as_slice()[..100],
            [
                95, 0, 100, 0, 98, 0, 117, 0, 89, 0, 100, 0, 103, 0, 105, 0, 115, 0, 93, 0, 94, 0,
                89, 0, 93, 0, 95, 0, 111, 0, 87, 0, 103, 0, 107, 0, 103, 0, 104, 0, 113, 0, 112, 0,
                108, 0, 123, 0, 110, 0, 99, 0, 98, 0, 100, 0, 91, 0, 95, 0, 91, 0, 90, 0, 102, 0,
                93, 0, 95, 0, 92, 0, 101, 0, 93, 0, 94, 0, 97, 0, 88, 0, 104, 0, 99, 0, 104, 0,
                117, 0, 101, 0, 110, 0, 97, 0, 103, 0, 112, 0
            ]
        );
        Ok(())
    }

    #[test]
    fn test_libczi_xml() -> Result<(), Box<dyn std::error::Error>> {
        let path = Path::new("test-files/Experiment-2029.czi");
        assert!(path.exists());
        let czi = CziReader::create()?;
        let stream = InputStream::create_from_file_utf8(path.to_string_lossy().as_ref())?;
        let open_info = ReaderOpenInfo::new(&stream);
        czi.open(open_info)?;
        let metadata_segment = czi.get_metadata_segment()?;
        let xml = metadata_segment.get_metadata_as_xml()?;
        let s = String::try_from(&xml)?;
        println!("xml: {}", &s[..s.len().min(100)]);
        assert_eq!(
            s[..s.len().min(100)].lines().collect::<Vec<_>>(),
            vec![
                "<ImageDocument>",
                "  <Metadata>",
                r#"    <Experiment Version="1.2">"#,
                "      <RunMode>OptimizeBeforePerformE",
            ]
        );
        Ok(())
    }

    #[test]
    fn test_libczi_pyramid_statistics() -> Result<(), Box<dyn std::error::Error>> {
        let path = PathBuf::from("test-files/Experiment-2029.czi");
        assert!(path.exists());
        let czi = CziReader::create()?;
        let stream = InputStream::create_from_file_utf8(path.to_string_lossy().as_ref())?;
        let open_info = ReaderOpenInfo::new(&stream);
        czi.open(open_info)?;
        let s = czi.get_pyramid_statistics()?;
        println!("xml: {}", &s[..s.len().min(100)]);
        assert_eq!(
            &s[..s.len().min(100)],
            r###"{"scenePyramidStatistics":{"2147483647":[{"layerInfo":{"minificationFactor":0,"pyramidLayerNo":0},"c"###
        );
        Ok(())
    }

    #[test]
    fn test_libczi_document_info() -> Result<(), Box<dyn std::error::Error>> {
        let path = PathBuf::from("test-files/Experiment-2029.czi");
        assert!(path.exists());
        let czi = CziReader::create()?;
        let stream = InputStream::create_from_file_utf8(path.to_string_lossy().as_ref())?;
        let open_info = ReaderOpenInfo::new(&stream);
        czi.open(open_info)?;
        let metadata_segment = czi.get_metadata_segment()?;
        let document_info = metadata_segment.get_czi_document_info()?;
        let general_document_info = document_info.get_general_document_info()?;
        println!(
            "xml: {}",
            &general_document_info[..general_document_info.len().min(100)]
        );
        assert_eq!(
            &general_document_info[..general_document_info.len().min(100)],
            r###"{"user_name":"zeiss","creation_date_time":"2023-11-27T14:35:29.3983006+01:00"}"###
        );
        Ok(())
    }

    #[test]
    fn test_lib_czi_build_information() -> Result<(), Box<dyn std::error::Error>> {
        let build_info = LibCZIBuildInformation::get()?;
        println!(
            "compiler information: {:?}",
            build_info.get_compiler_information()
        );
        println!("repository url: {:?}", build_info.get_repository_url());
        println!(
            "repository branch: {:?}",
            build_info.get_repository_branch()
        );
        println!("repository tag: {:?}", build_info.get_repository_tag());
        assert_eq!(
            build_info.get_repository_tag(),
            "61f74ff097d6d0fbe6e36f204ff59d92e299d7cd"
        );
        Ok(())
    }
}