use crate::ffi::{ExternPointer, OwnedPtr}; use crate::static_data::EffectParameter; use std::ffi::{c_char, CStr, CString}; use std::ptr::drop_in_place; mod ability; mod form; mod growth_rate; mod item; mod learnable_moves; mod move_data; mod nature; mod species; mod statistic_set; #[no_mangle] extern "C" fn effect_parameter_new_bool(value: u8) -> OwnedPtr { Box::into_raw(Box::new(EffectParameter::Bool(value == 1))) } #[no_mangle] extern "C" fn effect_parameter_new_int(value: i64) -> OwnedPtr { Box::into_raw(Box::new(EffectParameter::Int(value))) } #[no_mangle] extern "C" fn effect_parameter_new_float(value: f32) -> OwnedPtr { Box::into_raw(Box::new(EffectParameter::Float(value))) } #[no_mangle] unsafe extern "C" fn effect_parameter_new_string(value: *const c_char) -> OwnedPtr { Box::into_raw(Box::new(EffectParameter::String( CStr::from_ptr(value).to_str().unwrap().into(), ))) } #[no_mangle] unsafe extern "C" fn effect_parameter_drop(ptr: OwnedPtr) { drop_in_place(ptr) } #[no_mangle] extern "C" fn effect_parameter_get_type(ptr: ExternPointer) -> u8 { match ptr.as_ref() { EffectParameter::Bool(_) => 0, EffectParameter::Int(_) => 1, EffectParameter::Float(_) => 2, EffectParameter::String(_) => 3, } } #[no_mangle] extern "C" fn effect_parameter_get_as_bool(ptr: ExternPointer) -> u8 { let p = ptr.as_ref(); if let EffectParameter::Bool(b) = p { return if *b { 1 } else { 0 }; } panic!("Unexpected effect parameter. Expected bool, was: {}", p); } #[no_mangle] extern "C" fn effect_parameter_get_as_int(ptr: ExternPointer) -> i64 { let p = ptr.as_ref(); if let EffectParameter::Int(b) = p { return *b; } panic!("Unexpected effect parameter. Expected int, was: {}", p); } #[no_mangle] extern "C" fn effect_parameter_get_as_float(ptr: ExternPointer) -> f32 { let p = ptr.as_ref(); if let EffectParameter::Float(b) = p { return *b; } panic!("Unexpected effect parameter. Expected float, was: {}", p); } #[no_mangle] extern "C" fn effect_parameter_get_as_string(ptr: ExternPointer) -> OwnedPtr { let p = ptr.as_ref(); if let EffectParameter::String(b) = p { return CString::new(b.str().to_string()).unwrap().into_raw(); } panic!("Unexpected effect parameter. Expected string, was: {}", p); }