Skip to content

Commit

Permalink
Significant error handling improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
asherkin committed Jan 18, 2020
1 parent b2b5a0a commit aa81548
Show file tree
Hide file tree
Showing 7 changed files with 141 additions and 62 deletions.
13 changes: 6 additions & 7 deletions examples/async.rs
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,9 @@
use async_std::task;
use futures::executor::{LocalPool, LocalSpawner};
use futures::task::LocalSpawnExt;
use sm_ext::{c_str, native, register_natives, CallableParam, ExecType, Executable, GameFrameHookId, HandleId, HandleRef, HandleType, HasHandleType, IExtension, IExtensionInterface, IForwardManager, IHandleSys, IPluginContext, IPluginFunction, IShareSys, ISourceMod, SMExtension, SMInterfaceApi};
use sm_ext::{native, register_natives, CallableParam, ExecType, Executable, GameFrameHookId, HandleId, HandleRef, HandleType, HasHandleType, IExtension, IExtensionInterface, IForwardManager, IHandleSys, IPluginContext, IPluginFunction, IShareSys, ISourceMod, SMExtension, SMInterfaceApi};
use std::cell::RefCell;
use std::error::Error;
use std::ffi::CString;
use std::time::Duration;

struct IntHandle(i32);
Expand Down Expand Up @@ -111,21 +110,21 @@ impl MyExtension {
}

impl IExtensionInterface for MyExtension {
fn on_extension_load(&mut self, myself: IExtension, sys: IShareSys, late: bool) -> Result<(), CString> {
fn on_extension_load(&mut self, myself: IExtension, sys: IShareSys, late: bool) -> Result<(), Box<dyn std::error::Error>> {
println!(">>> Rusty extension loaded! me = {:?}, sys = {:?}, late = {:?}", myself, sys, late);

let forward_manager: IForwardManager = sys.request_interface(&myself).map_err(|_| c_str!("Failed to get IForwardManager interface"))?;
let forward_manager: IForwardManager = sys.request_interface(&myself)?;
println!(">>> Got interface: {:?} v{:?}", forward_manager.get_interface_name(), forward_manager.get_interface_version());

let sourcemod: ISourceMod = sys.request_interface(&myself).map_err(|_| c_str!("Failed to get ISourceMod interface"))?;
let sourcemod: ISourceMod = sys.request_interface(&myself)?;
println!(">>> Got interface: {:?} v{:?}", sourcemod.get_interface_name(), sourcemod.get_interface_version());

let handlesys: IHandleSys = sys.request_interface(&myself).map_err(|_| c_str!("Failed to get IHandleSys interface"))?;
let handlesys: IHandleSys = sys.request_interface(&myself)?;
println!(">>> Got interface: {:?} v{:?}", handlesys.get_interface_name(), handlesys.get_interface_version());

self.frame_hook = Some(sourcemod.add_game_frame_hook(on_game_frame));

self.handle_type = Some(handlesys.create_type("IntHandle", myself.get_identity()).map_err(|_| c_str!("Failed to create handle type"))?);
self.handle_type = Some(handlesys.create_type("IntHandle", myself.get_identity())?);

register_natives!(
&sys,
Expand Down
3 changes: 1 addition & 2 deletions examples/basic.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
//! Minimal example of a valid SourceMod extension.

use sm_ext::{IExtension, IExtensionInterface, IShareSys, SMExtension};
use std::ffi::CString;

#[derive(Default, SMExtension)]
#[extension(name = "Rusty", description = "Sample extension written in Rust")]
pub struct MyExtension;

impl IExtensionInterface for MyExtension {
fn on_extension_load(&mut self, myself: IExtension, sys: IShareSys, late: bool) -> Result<(), CString> {
fn on_extension_load(&mut self, myself: IExtension, sys: IShareSys, late: bool) -> Result<(), Box<dyn std::error::Error>> {
println!(">>> Rusty extension loaded! me = {:?}, sys = {:?}, late = {:?}", myself, sys, late);

Ok(())
Expand Down
7 changes: 3 additions & 4 deletions examples/data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@

use sm_ext::{c_str, cell_t, native, register_natives, ExecType, Executable, GameFrameHookId, IExtension, IExtensionInterface, IForwardManager, IPluginContext, IPluginFunction, IShareSys, ISourceMod, ParamType, SMExtension, SMInterfaceApi};
use std::error::Error;
use std::ffi::CString;

#[native]
fn test_native(ctx: &IPluginContext, mut func: IPluginFunction) -> Result<cell_t, Box<dyn Error>> {
Expand Down Expand Up @@ -88,13 +87,13 @@ impl MyExtension {
}

impl IExtensionInterface for MyExtension {
fn on_extension_load(&mut self, myself: IExtension, sys: IShareSys, late: bool) -> Result<(), CString> {
fn on_extension_load(&mut self, myself: IExtension, sys: IShareSys, late: bool) -> Result<(), Box<dyn std::error::Error>> {
println!(">>> Rusty extension loaded! me = {:?}, sys = {:?}, late = {:?}", myself, sys, late);

let forward_manager: IForwardManager = sys.request_interface(&myself).map_err(|_| c_str!("Failed to get IForwardManager interface"))?;
let forward_manager: IForwardManager = sys.request_interface(&myself)?;
println!(">>> Got interface: {:?} v{:?}", forward_manager.get_interface_name(), forward_manager.get_interface_version());

let sourcemod: ISourceMod = sys.request_interface(&myself).map_err(|_| c_str!("Failed to get ISourceMod interface"))?;
let sourcemod: ISourceMod = sys.request_interface(&myself)?;
println!(">>> Got interface: {:?} v{:?}", sourcemod.get_interface_name(), sourcemod.get_interface_version());

sourcemod.add_frame_action(|| {
Expand Down
8 changes: 4 additions & 4 deletions examples/forwards.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
//! ```

use sm_ext::{c_str, forwards, native, register_natives, ExecType, IExtension, IExtensionInterface, IForwardManager, IPluginContext, IShareSys, SMExtension, SMInterfaceApi};
use std::ffi::{CStr, CString};
use std::ffi::CStr;

#[forwards]
struct MyForwards {
Expand Down Expand Up @@ -48,13 +48,13 @@ fn test_native_call(_ctx: &IPluginContext, a: i32, b: i32) -> Result<i32, sm_ext
pub struct MyExtension;

impl IExtensionInterface for MyExtension {
fn on_extension_load(&mut self, myself: IExtension, sys: IShareSys, late: bool) -> Result<(), CString> {
fn on_extension_load(&mut self, myself: IExtension, sys: IShareSys, late: bool) -> Result<(), Box<dyn std::error::Error>> {
println!(">>> Rusty extension loaded! me = {:?}, sys = {:?}, late = {:?}", myself, sys, late);

let forward_manager: IForwardManager = sys.request_interface(&myself).map_err(|_| c_str!("Failed to get IForwardManager interface"))?;
let forward_manager: IForwardManager = sys.request_interface(&myself)?;
println!(">>> Got interface: {:?} v{:?}", forward_manager.get_interface_name(), forward_manager.get_interface_version());

MyForwards::register(&forward_manager).map_err(|err| CString::new(format!("Failed to register forwards: {:?}", err)).unwrap())?;
MyForwards::register(&forward_manager)?;

register_natives!(
&sys,
Expand Down
10 changes: 4 additions & 6 deletions examples/handles.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@
//! }
//! ```

use sm_ext::{c_str, cell_t, native, register_natives, HandleError, HandleRef, HandleType, HasHandleType, IExtension, IExtensionInterface, IHandleSys, IPluginContext, IShareSys, SMExtension, SMInterfaceApi, TryIntoPlugin};
use std::ffi::CString;
use sm_ext::{cell_t, native, register_natives, HandleError, HandleRef, HandleType, HasHandleType, IExtension, IExtensionInterface, IHandleSys, IPluginContext, IShareSys, SMExtension, SMInterfaceApi, TryIntoPlugin};

#[derive(Debug)]
struct RustContext(i32);
Expand Down Expand Up @@ -82,14 +81,13 @@ impl MyExtension {
}

impl IExtensionInterface for MyExtension {
fn on_extension_load(&mut self, myself: IExtension, sys: IShareSys, late: bool) -> Result<(), CString> {
fn on_extension_load(&mut self, myself: IExtension, sys: IShareSys, late: bool) -> Result<(), Box<dyn std::error::Error>> {
println!(">>> Rusty extension loaded! me = {:?}, sys = {:?}, late = {:?}", myself, sys, late);

let handlesys: IHandleSys = sys.request_interface(&myself).map_err(|_| c_str!("Failed to get IHandleSys interface"))?;
let handlesys: IHandleSys = sys.request_interface(&myself)?;
println!(">>> Got interface: {:?} v{:?}", handlesys.get_interface_name(), handlesys.get_interface_version());

let handle_type: HandleType<RustContext> = handlesys.create_type("RustContext", myself.get_identity()).map_err(|_| c_str!("Failed to create RustContext Handle type"))?;
self.handle_type = Some(handle_type);
self.handle_type = Some(handlesys.create_type("RustContext", myself.get_identity())?);

register_natives!(
&sys,
Expand Down
4 changes: 2 additions & 2 deletions examples/natives.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
//! ```

use sm_ext::{native, register_natives, IExtension, IExtensionInterface, IPluginContext, IShareSys, SMExtension};
use std::ffi::{CStr, CString};
use std::ffi::CStr;

/// A native that adds two integers.
///
Expand Down Expand Up @@ -67,7 +67,7 @@ fn test_native(ctx: &IPluginContext, a: i32, b: f32, c: &CStr, d: &mut i32, e: &
pub struct MyExtension;

impl IExtensionInterface for MyExtension {
fn on_extension_load(&mut self, myself: IExtension, sys: IShareSys, late: bool) -> Result<(), CString> {
fn on_extension_load(&mut self, myself: IExtension, sys: IShareSys, late: bool) -> Result<(), Box<dyn std::error::Error>> {
println!(">>> Rusty extension loaded! me = {:?}, sys = {:?}, late = {:?}", myself, sys, late);

register_natives!(
Expand Down

0 comments on commit aa81548

Please sign in to comment.