A bunch more work on replacing every potential panic with results
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
@@ -1,9 +1,10 @@
|
||||
use crate::ffi::{ffi_arc_dyn_getter, BorrowedPtr, ExternPointer, IdentifiablePointer, OwnedPtr};
|
||||
use crate::ffi::{ffi_arc_dyn_getter, BorrowedPtr, ExternPointer, IdentifiablePointer, NativeResult, OwnedPtr};
|
||||
use crate::static_data::{
|
||||
EffectParameter, MoveCategory, MoveData, MoveDataImpl, MoveTarget, SecondaryEffect, SecondaryEffectImpl,
|
||||
TypeIdentifier,
|
||||
};
|
||||
use crate::StringKey;
|
||||
use anyhow::anyhow;
|
||||
use hashbrown::HashSet;
|
||||
use std::ffi::{c_char, CStr, CString};
|
||||
use std::ptr::drop_in_place;
|
||||
@@ -23,12 +24,19 @@ unsafe extern "C" fn move_data_new(
|
||||
secondary_effect: *mut Box<dyn SecondaryEffect>,
|
||||
flags: *const *const c_char,
|
||||
flags_length: usize,
|
||||
) -> IdentifiablePointer<Arc<dyn MoveData>> {
|
||||
) -> NativeResult<IdentifiablePointer<Arc<dyn MoveData>>> {
|
||||
let flags = std::slice::from_raw_parts(flags, flags_length);
|
||||
let name: StringKey = CStr::from_ptr(name).to_str().unwrap().into();
|
||||
let name: StringKey = match CStr::from_ptr(name).to_str() {
|
||||
Ok(name) => name.into(),
|
||||
Err(_) => return NativeResult::err_from_str("Unable to convert name to string"),
|
||||
};
|
||||
let mut flags_set: HashSet<StringKey> = HashSet::with_capacity(flags_length);
|
||||
for flag in flags {
|
||||
flags_set.insert(CStr::from_ptr(*flag).to_str().unwrap().into());
|
||||
let flag = match CStr::from_ptr(*flag).to_str() {
|
||||
Ok(flag) => flag,
|
||||
Err(_) => return NativeResult::err_from_str("Unable to convert flag to string"),
|
||||
};
|
||||
flags_set.insert(flag.into());
|
||||
}
|
||||
let secondary_effect = if secondary_effect.is_null() {
|
||||
None
|
||||
@@ -47,7 +55,7 @@ unsafe extern "C" fn move_data_new(
|
||||
secondary_effect,
|
||||
flags_set,
|
||||
));
|
||||
a.into()
|
||||
NativeResult::ok(a.into())
|
||||
}
|
||||
|
||||
/// Drops a reference counted move.
|
||||
@@ -58,9 +66,12 @@ unsafe extern "C" fn move_data_drop(ptr: OwnedPtr<Arc<dyn MoveData>>) {
|
||||
|
||||
/// The name of the move.
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn move_data_name(ptr: ExternPointer<Arc<dyn MoveData>>) -> OwnedPtr<c_char> {
|
||||
unsafe extern "C" fn move_data_name(ptr: ExternPointer<Arc<dyn MoveData>>) -> NativeResult<OwnedPtr<c_char>> {
|
||||
let name = ptr.as_ref().name();
|
||||
CString::new(name.str()).unwrap().into_raw()
|
||||
match CString::new(name.str()) {
|
||||
Ok(name) => NativeResult::ok(name.into_raw()),
|
||||
Err(_) => NativeResult::err_from_str("Unable to convert name to string"),
|
||||
}
|
||||
}
|
||||
|
||||
ffi_arc_dyn_getter!(MoveData, move_type, TypeIdentifier);
|
||||
@@ -122,8 +133,16 @@ unsafe extern "C" fn secondary_effect_chance(ptr: ExternPointer<Box<dyn Secondar
|
||||
|
||||
/// The name of the effect.
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn secondary_effect_effect_name(ptr: ExternPointer<Box<dyn SecondaryEffect>>) -> OwnedPtr<c_char> {
|
||||
CString::new(ptr.as_ref().effect_name().str()).unwrap().into_raw()
|
||||
unsafe extern "C" fn secondary_effect_effect_name(
|
||||
ptr: ExternPointer<Box<dyn SecondaryEffect>>,
|
||||
) -> NativeResult<OwnedPtr<c_char>> {
|
||||
match CString::new(ptr.as_ref().effect_name().str()) {
|
||||
Ok(name) => NativeResult::ok(name.into_raw()),
|
||||
Err(_) => NativeResult::err(anyhow!(
|
||||
"Unable to convert effect name '{}' to CString",
|
||||
ptr.as_ref().effect_name()
|
||||
)),
|
||||
}
|
||||
}
|
||||
|
||||
/// The length of parameters of the effect.
|
||||
|
||||
Reference in New Issue
Block a user