gmod 16.0.2

A swiss army knife for creating binary modules for Garry's Mod in Rust
Documentation
use std::{num::NonZeroI32, borrow::Cow};

#[repr(transparent)]
pub struct ValuesReturned(pub i32);

impl From<ValuesReturned> for i32 {
	#[inline(always)]
	fn from(v: ValuesReturned) -> Self {
		v.0
	}
}

impl From<i32> for ValuesReturned {
	#[inline(always)]
	fn from(n: i32) -> Self {
		ValuesReturned(n)
	}
}

impl From<NonZeroI32> for ValuesReturned {
	#[inline(always)]
	fn from(n: NonZeroI32) -> ValuesReturned {
		ValuesReturned(i32::from(n))
	}
}

impl From<()> for ValuesReturned {
	#[inline(always)]
	fn from(_: ()) -> ValuesReturned {
		ValuesReturned(0)
	}
}

impl From<Option<NonZeroI32>> for ValuesReturned {
	#[inline(always)]
	fn from(opt: Option<NonZeroI32>) -> ValuesReturned {
		ValuesReturned(match opt {
			Some(vals) => i32::from(vals),
			None => {
				unsafe { super::state().push_nil() };
				1
			},
		})
	}
}

pub trait DisplayLuaError {
	fn display_lua_error(&self) -> Cow<'_, str>;
}
impl<E: std::fmt::Debug> DisplayLuaError for E {
	#[inline(always)]
	fn display_lua_error(&self) -> Cow<'_, str> {
		Cow::Owned(format!("{:?}", self))
	}
}
impl<E: DisplayLuaError> From<Result<i32, E>> for ValuesReturned {
	#[inline(always)]
	fn from(res: Result<i32, E>) -> ValuesReturned {
		match res {
			Ok(vals) => ValuesReturned(vals),
			Err(err) => unsafe { super::state().error(err.display_lua_error().as_ref()) }
		}
	}
}
impl<E: DisplayLuaError> From<Result<(), E>> for ValuesReturned {
	#[inline(always)]
	fn from(res: Result<(), E>) -> ValuesReturned {
		match res {
			Ok(_) => ValuesReturned(0),
			Err(err) => unsafe { super::state().error(err.display_lua_error().as_ref()) }
		}
	}
}