openslide 0.2.0

Rust bindings to the OpenSlide C library
Documentation
//! Rust bindings to OpenSlide ([https://openslide.org/](https://openslide.org/)).
//!
//! This work has no affiliations with the official OpenSlide project.
//!
//! ## Requirements
//!
//! This library has been built for
//!
//! ```text,no_run
//! OpenSlide 3.4.1
//! Rust 1.26
//! ```
//!
//! I cannot guarantee that it works for other versions.
//!
//! ## Building OpenSlide
//!
//! Download the OpenSlide `3.4.1` from
//! [https://openslide.org/download/](https://openslide.org/download/)
//! to some location (here, `DOWNLOAD_DIR`)
//!
//! Build the project somewhere (here, `BUILD_DIR`):
//!
//! ```shell,no_run
//! cd BUILD_DIR
//! tar xvzf DOWNLOAD_DIR/openslide-3.4.1.tar.gz
//! cd openslide-3.4.1
//! ./configure
//! make
//! sudo make install
//! ```
//!
//! In the build output, you will see something like this
//!
//! ```shell,no_run
//! Libraries have been installed in:
//!    /usr/local/lib
//! ```
//!
//! To make the library discoverable, we append it (call it `LIB_DIR`) to the `LD_LIBRARY_PATH`
//! environment variable
//!
//! ```shell,no_run
//! export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:LIB_DIR
//! ```
//!
//! You should now be able to compile, and run a project using this OpenSlide binding. See the
//! `examples` folder for examples.
//!
//! ## Interface
//!
//! This library provides both a *native* interface, and a more *convenient* interface.
//!
//! ### Native interface
//!
//! The native interface contains the raw bindings to the OpenSlide API, without any fluff. This
//! interface should be close to the C interface in the original library, both with regards to function
//! naming and documentation. This serves at least two purposes:
//!
//! 1: You can easily use the documentation for the C library
//! 2: If you are not happy with my convenience wrappers, you could use this raw api to create your
//! own.
//!
//! ```rust,no_run
//! //! Example using the raw binding api
//!
//! extern crate failure;
//! extern crate openslide;
//!
//! use failure::Error;
//! use openslide::bindings;
//!
//! fn main() -> Result<(), Error> {
//!     let filename = "assets/CMU-1-Small-Region.svs";
//!     let osr = bindings::open(filename)?;
//!     let num_levels = bindings::get_level_count(osr)?;
//!     println!("Slide has {} levels", num_levels);
//!     bindings::close(osr);
//!
//!     Ok(())
//! }
//! ```
//!
//! Note that few or none assertions are made on correct use (like checking for valid number of levels
//! or non-negative zoom factors). Also, as shown in the small example above, you have to close the
//! slide explicitly.
//!
//! ### Convenience interface
//!
//! The convenience interface wraps the native interface and provides a more rust-like interface. These
//! wrappings will enforce correct use via the type system and other checks. There is also no need to
//! explicitly close an open slide, as the `OpenSlide` struct implements the `Drop` trait.
//!
//! ```rust,no_run
//! //! Example using the convenience binding api
//!
//! extern crate failure;
//! extern crate openslide;
//!
//! use std::path::Path;
//! use failure::Error;
//! use openslide::OpenSlide;
//!
//! fn main() -> Result<(), Error> {
//!     let filename = Path::new("assets/CMU-1-Small-Region.svs");
//!     let os = openslide::OpenSlide::new(&filename)?;
//!     let num_levels = os.get_level_count()?;
//!     println!("Slide has {} levels", num_levels);
//!
//!     Ok(())
//! }
//! ```
//!

extern crate libc;
extern crate failure;
extern crate image;
extern crate num;

/*
pub use bindings::{OpenSlideT,
                   detect_vendor,
                   open,
                   close,
                   get_level_count,
                   get_level0_dimensions,
                   get_level_dimensions,
                   get_level_downsample,
                   get_best_level_for_downsample,
                   read_region,
                   get_error,
                   get_property_names,
                   get_property_value,
};
*/

pub use convenience::{OpenSlide,
};

pub mod bindings;
pub mod utils;
mod convenience;
pub mod properties;