gdal 0.1.1

GDAL bindings for Rust
Documentation
use std::ffi::CString;
use std::ptr::null;
use std::sync::{Once, ONCE_INIT};
use std::path::Path;
use vector::{ogr, Dataset};

static START: Once = ONCE_INIT;
static mut registered_drivers: bool = false;


pub fn _register_drivers() {
    unsafe {
        START.call_once(|| {
            ogr::OGRRegisterAll();
            registered_drivers = true;
        });
    }
}

pub struct Driver {
    c_driver: *const (),
}

impl Driver {
    pub fn get(name: &str) -> Option<Driver> {
        _register_drivers();
        let c_name = CString::new(name.as_bytes()).unwrap();
        let c_driver = unsafe { ogr::OGRGetDriverByName(c_name.as_ptr()) };
        return match c_driver.is_null() {
            true  => None,
            false => Some(Driver{c_driver: c_driver}),
        };
    }

    pub fn create(&self, path: &Path) -> Option<Dataset> {
        let filename = path.to_str().unwrap();
        let c_filename = CString::new(filename.as_bytes()).unwrap();
        let c_dataset = unsafe { ogr::OGR_Dr_CreateDataSource(
            self.c_driver,
            c_filename.as_ptr(),
            null(),
        ) };
        return match c_dataset.is_null() {
            true  => None,
            false => unsafe { Some(Dataset::_with_c_dataset(c_dataset)) },
        };
    }
}