co3 0.4.0

Build C API from Rust
Documentation
use co3::ffi;
ffi! {
    #![unsafe(export("C"))]
    #![symbol_prefix = "co3_static"]

    pub static VERSION: u32 = 7;
    #[symbol_name = "co3_static_flags"]
    pub static mut FLAGS: u32 = 0;
}

mod imported {
    use co3::ffi;

    ffi! {
        #![unsafe(extern("C"))]
        #![symbol_prefix = "co3_static"]

        pub static VERSION: u32;
        #[symbol_name = "co3_static_flags"]
        pub static mut FLAGS: u32;
    }
}

static_assertions::assert_impl_all!(__Co3Static_VERSION: Copy, Clone, Send, Sync);
static_assertions::assert_impl_all!(__Co3Static_FLAGS: Copy, Clone, Send);
static_assertions::assert_not_impl_any!(__Co3Static_FLAGS: Sync);

#[test]
fn immutable_static_has_the_imported_abi() {
    assert_eq!(*VERSION, 7);
    assert_eq!(*imported::VERSION.get().unwrap(), 7);
    assert_eq!(*unsafe { imported::VERSION.get_unchecked() }, 7);
    assert_eq!(imported::VERSION.read(), Some(7));
}

#[test]
fn mutable_static_has_the_imported_abi() {
    unsafe {
        imported::FLAGS.set(3);
        let flags = imported::FLAGS.read().unwrap();
        assert_eq!(flags, 3);
        assert_eq!(FLAGS.read(), Some(3));
        assert_eq!(imported::FLAGS.take(), Some(3));
        assert_eq!(FLAGS.read(), Some(0));
    }
}