PkmnLib_rs/src/ffi/static_data/mod.rs

109 lines
3.8 KiB
Rust
Raw Normal View History

use crate::ffi::{ExternPointer, IdentifiablePointer, OwnedPtr};
2022-09-18 16:02:13 +00:00
use crate::static_data::EffectParameter;
use crate::StringKey;
2022-09-18 16:02:13 +00:00
use std::ffi::{c_char, CStr, CString};
use std::ptr::drop_in_place;
2022-10-14 14:53:30 +00:00
/// The Foreign Function Interface for abilities
2022-09-18 16:02:13 +00:00
mod ability;
2022-10-14 14:53:30 +00:00
/// The Foreign Function Interface for forms
2022-09-18 16:02:13 +00:00
mod form;
2022-10-14 14:53:30 +00:00
/// The Foreign Function Interface for growth rates
2022-09-18 16:02:13 +00:00
mod growth_rate;
2022-10-14 14:53:30 +00:00
/// The Foreign Function Interface for items
2022-09-18 16:02:13 +00:00
mod item;
2022-10-14 14:53:30 +00:00
/// The Foreign Function Interface for learnable moves
2022-09-18 16:02:13 +00:00
mod learnable_moves;
2022-10-14 14:53:30 +00:00
/// The Foreign Function Interface for libraries
mod libraries;
2022-10-14 14:53:30 +00:00
/// The Foreign Function Interface for moves
2022-09-18 16:02:13 +00:00
mod move_data;
2022-10-14 14:53:30 +00:00
/// The Foreign Function Interface for natures
2022-09-18 16:02:13 +00:00
mod nature;
2022-10-14 14:53:30 +00:00
/// The Foreign Function Interface for species
2022-09-18 16:02:13 +00:00
mod species;
2022-10-14 14:53:30 +00:00
/// The Foreign Function Interface for sets of statistics
2022-09-18 16:02:13 +00:00
mod statistic_set;
2022-10-14 14:53:30 +00:00
/// Instantiates an effect parameter with a boolean.
2022-09-18 16:02:13 +00:00
#[no_mangle]
extern "C" fn effect_parameter_new_bool(value: u8) -> IdentifiablePointer<EffectParameter> {
Box::<EffectParameter>::new((value == 1).into()).into()
2022-09-18 16:02:13 +00:00
}
2022-10-14 14:53:30 +00:00
/// Instantiates an effect parameter with an integer.
2022-09-18 16:02:13 +00:00
#[no_mangle]
extern "C" fn effect_parameter_new_int(value: i64) -> IdentifiablePointer<EffectParameter> {
Box::<EffectParameter>::new(value.into()).into()
2022-09-18 16:02:13 +00:00
}
2022-10-14 14:53:30 +00:00
/// Instantiates an effect parameter with a float.
2022-09-18 16:02:13 +00:00
#[no_mangle]
extern "C" fn effect_parameter_new_float(value: f32) -> IdentifiablePointer<EffectParameter> {
Box::<EffectParameter>::new(value.into()).into()
2022-09-18 16:02:13 +00:00
}
2022-10-14 14:53:30 +00:00
/// Instantiates an effect parameter with a string.
2022-09-18 16:02:13 +00:00
#[no_mangle]
unsafe extern "C" fn effect_parameter_new_string(value: *const c_char) -> IdentifiablePointer<EffectParameter> {
let sk: StringKey = CStr::from_ptr(value).to_str().unwrap().into();
Box::<EffectParameter>::new(sk.into()).into()
2022-09-18 16:02:13 +00:00
}
2022-10-14 14:53:30 +00:00
/// Drop an effect parameter.
2022-09-18 16:02:13 +00:00
#[no_mangle]
unsafe extern "C" fn effect_parameter_drop(ptr: OwnedPtr<EffectParameter>) {
drop_in_place(ptr)
}
2022-10-14 14:53:30 +00:00
/// Get the type of an effect parameter.
2022-09-18 16:02:13 +00:00
#[no_mangle]
extern "C" fn effect_parameter_get_type(ptr: ExternPointer<EffectParameter>) -> u8 {
match ptr.as_ref() {
EffectParameter::Bool(_, _) => 0,
EffectParameter::Int(_, _) => 1,
EffectParameter::Float(_, _) => 2,
EffectParameter::String(_, _) => 3,
2022-09-18 16:02:13 +00:00
}
}
2022-10-14 14:53:30 +00:00
/// Get the boolean contained in the effect parameter, panics if the effect parameter is not a bool.
2022-09-18 16:02:13 +00:00
#[no_mangle]
extern "C" fn effect_parameter_get_as_bool(ptr: ExternPointer<EffectParameter>) -> u8 {
let p = ptr.as_ref();
if let EffectParameter::Bool(_, b) = p {
2022-10-14 14:53:30 +00:00
return u8::from(*b);
2022-09-18 16:02:13 +00:00
}
panic!("Unexpected effect parameter. Expected bool, was: {}", p);
}
2022-10-14 14:53:30 +00:00
/// Get the int contained in the effect parameter, panics if the effect parameter is not a int.
2022-09-18 16:02:13 +00:00
#[no_mangle]
extern "C" fn effect_parameter_get_as_int(ptr: ExternPointer<EffectParameter>) -> i64 {
let p = ptr.as_ref();
if let EffectParameter::Int(_, b) = p {
2022-09-18 16:02:13 +00:00
return *b;
}
panic!("Unexpected effect parameter. Expected int, was: {}", p);
}
2022-10-14 14:53:30 +00:00
/// Get the float contained in the effect parameter, panics if the effect parameter is not a float.
2022-09-18 16:02:13 +00:00
#[no_mangle]
extern "C" fn effect_parameter_get_as_float(ptr: ExternPointer<EffectParameter>) -> f32 {
let p = ptr.as_ref();
if let EffectParameter::Float(_, b) = p {
2022-09-18 16:02:13 +00:00
return *b;
}
panic!("Unexpected effect parameter. Expected float, was: {}", p);
}
2022-10-14 14:53:30 +00:00
/// Get the string contained in the effect parameter, panics if the effect parameter is not a string.
2022-09-18 16:02:13 +00:00
#[no_mangle]
extern "C" fn effect_parameter_get_as_string(ptr: ExternPointer<EffectParameter>) -> OwnedPtr<c_char> {
let p = ptr.as_ref();
if let EffectParameter::String(_, b) = p {
2022-09-18 16:02:13 +00:00
return CString::new(b.str().to_string()).unwrap().into_raw();
}
panic!("Unexpected effect parameter. Expected string, was: {}", p);
}