dlopen 0.1.8

Library for opening and operating on dynamic link libraries (also known as shared objects or shared libraries). This is a modern and more flexible alternative to the already existing libraries like libloading or sharedlib
Documentation
extern crate dlopen;
extern crate libc;
extern crate regex;
use dlopen::utils::{PLATFORM_FILE_EXTENSION, PLATFORM_FILE_PREFIX};
use std::env;
use std::path::PathBuf;
use libc::c_int;

//Rust when building dependencies adds some weird numbers to file names
// find the file using this pattern:
//const FILE_PATTERN: &str = concat!(PLATFORM_FILE_PREFIX, "example.*\\.", PLATFORM_FILE_EXTENSION);


pub fn example_lib_path() -> PathBuf {
    let file_pattern = format!(
        r"{}example.*\.{}",
        PLATFORM_FILE_PREFIX,
        PLATFORM_FILE_EXTENSION
    );
    let file_regex = regex::Regex::new(file_pattern.as_ref()).unwrap();
    //build path to the example library that covers most cases
    let mut lib_path = PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap());
    lib_path.extend(["target", "debug", "deps"].iter());
    let entry = lib_path.read_dir().unwrap().find(|e| match e {
        &Ok(ref entry) => file_regex.is_match(entry.file_name().to_str().unwrap()),
        &Err(ref err) => panic!("Could not read cargo debug directory: {}", err),
    });
    lib_path.push(entry.unwrap().unwrap().file_name());
    println!("Library path: {}", lib_path.to_str().unwrap());
    lib_path
}

#[allow(dead_code)] //not all examples use this and this generates warnings
#[repr(C)]
pub struct SomeData {
    pub first: c_int,
    pub second: c_int,
}