PkmnLib_rs/src/ffi/static_data/libraries/nature_library.rs

49 lines
1.3 KiB
Rust

use crate::ffi::{BorrowedPtr, ExternPointer, OwnedPtr};
use crate::static_data::{Nature, NatureLibrary};
use std::ffi::{c_char, CStr, CString};
use std::ptr::drop_in_place;
use std::sync::Arc;
#[no_mangle]
extern "C" fn nature_library_new(capacity: usize) -> OwnedPtr<NatureLibrary> {
Box::into_raw(Box::new(NatureLibrary::new(capacity)))
}
#[no_mangle]
unsafe extern "C" fn nature_library_drop(ptr: OwnedPtr<NatureLibrary>) {
drop_in_place(ptr);
}
#[no_mangle]
unsafe extern "C" fn nature_library_load_nature(
ptr: ExternPointer<NatureLibrary>,
name: BorrowedPtr<c_char>,
nature: OwnedPtr<Nature>,
) {
ptr.as_mut()
.load_nature(CStr::from_ptr(name).into(), *Box::from_raw(nature))
}
#[no_mangle]
unsafe extern "C" fn nature_library_get_nature(
ptr: ExternPointer<NatureLibrary>,
name: BorrowedPtr<c_char>,
) -> BorrowedPtr<Nature> {
if let Some(nature) = ptr.as_ref().get_nature(&CStr::from_ptr(name).into()) {
Arc::into_raw(nature.clone())
} else {
std::ptr::null()
}
}
#[no_mangle]
unsafe extern "C" fn nature_library_get_nature_name(
ptr: ExternPointer<NatureLibrary>,
nature: BorrowedPtr<Nature>,
) -> OwnedPtr<c_char> {
let arc = Arc::from_raw(nature);
CString::new(ptr.as_ref().get_nature_name(&arc).str())
.unwrap()
.into_raw()
}