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

80 lines
3.3 KiB
Rust
Raw Normal View History

2022-10-14 14:53:30 +00:00
/// The foreign function interface for the growth rate library.
2022-10-01 13:40:15 +00:00
mod growth_rate_library;
2022-10-14 14:53:30 +00:00
/// The foreign function interface for the library settings.
2022-10-01 13:40:15 +00:00
mod library_settings;
2022-10-14 14:53:30 +00:00
/// The foreign function interface for the nature library.
2022-10-01 13:40:15 +00:00
mod nature_library;
2022-10-14 14:53:30 +00:00
/// The foreign function interface for the static data.
2022-10-01 13:40:15 +00:00
mod static_data;
2022-10-14 14:53:30 +00:00
/// The foreign function interface for the type library.
2022-10-01 13:40:15 +00:00
mod type_library;
use crate::ffi::{BorrowedPtr, IdentifiablePointer, OwnedPtr};
2022-10-01 13:40:15 +00:00
use crate::static_data::*;
use std::ffi::{c_char, CStr};
use std::ptr::drop_in_place;
use std::sync::Arc;
2022-10-14 14:53:30 +00:00
/// Generates foreign function interfaces for a DataLibrary trait implementation.
2022-10-01 13:40:15 +00:00
macro_rules! library_interface {
2022-12-24 11:00:50 +00:00
($library_type_name:ident, $library_type:ty, $return_type:ty) => {
2022-10-01 13:40:15 +00:00
paste::paste! {
#[no_mangle]
2022-12-24 11:00:50 +00:00
extern "C" fn [< $library_type_name:snake _new >](capacity: usize) -> IdentifiablePointer<$library_type> {
let value: $library_type = Box::new([<$library_type_name Impl>]::new(capacity));
value.into()
2022-10-01 13:40:15 +00:00
}
#[no_mangle]
2022-12-24 11:00:50 +00:00
unsafe extern "C" fn [< $library_type_name:snake _drop >](ptr: OwnedPtr<$library_type>) {
2022-10-01 13:40:15 +00:00
drop_in_place(ptr);
}
#[no_mangle]
2022-12-24 11:00:50 +00:00
unsafe extern "C" fn [< $library_type_name:snake _add >](ptr: OwnedPtr<$library_type>, key: BorrowedPtr<c_char>, value: OwnedPtr<Arc<$return_type>>) {
2022-10-01 13:40:15 +00:00
let lib = ptr.as_mut().unwrap();
lib.add(&CStr::from_ptr(key).into(), *Box::from_raw(value));
}
#[no_mangle]
2022-12-24 11:00:50 +00:00
unsafe extern "C" fn [< $library_type_name:snake _remove >](ptr: OwnedPtr<$library_type>, key: BorrowedPtr<c_char>) {
2022-10-01 13:40:15 +00:00
let lib = ptr.as_mut().unwrap();
lib.remove(&CStr::from_ptr(key).into());
}
#[no_mangle]
2022-12-24 11:00:50 +00:00
unsafe extern "C" fn [< $library_type_name:snake _get >](ptr: OwnedPtr<$library_type>, key: BorrowedPtr<c_char>) -> IdentifiablePointer<Arc<$return_type>> {
2022-10-01 13:40:15 +00:00
let lib = ptr.as_mut().unwrap();
let v = lib.get(&CStr::from_ptr(key).into());
if let Some(value) = v {
value.clone().into()
2022-10-01 13:40:15 +00:00
} else {
IdentifiablePointer::none()
2022-10-01 13:40:15 +00:00
}
}
#[no_mangle]
2022-12-24 11:00:50 +00:00
unsafe extern "C" fn [< $library_type_name:snake _get_key_by_index >](ptr: OwnedPtr<$library_type>, index: usize) -> OwnedPtr<c_char> {
2022-10-01 13:40:15 +00:00
let lib = ptr.as_mut().unwrap();
let v = lib.get_key_by_index(index);
if let Some(value) = v {
std::ffi::CString::new(value.str()).unwrap().into_raw()
} else {
std::ptr::null_mut()
}
}
#[no_mangle]
2022-12-24 11:00:50 +00:00
unsafe extern "C" fn [< $library_type_name:snake _len >](ptr: OwnedPtr<$library_type>) -> usize {
2022-10-01 13:40:15 +00:00
let lib = ptr.as_mut().unwrap();
lib.len()
}
}
};
}
2022-12-24 11:00:50 +00:00
library_interface!(SpeciesLibrary, Box<dyn SpeciesLibrary>, dyn Species);
library_interface!(MoveLibrary, Box<dyn MoveLibrary>, dyn MoveData);
library_interface!(AbilityLibrary, Box<dyn AbilityLibrary>, dyn Ability);
library_interface!(ItemLibrary, Box<dyn ItemLibrary>, dyn Item);