use core::marker::PhantomData;
use scale::Encode;
cfg_if::cfg_if! {
if #[cfg(target_arch = "wasm32")] {
mod wasm32;
pub use wasm32::*;
} else if #[cfg(target_arch = "riscv32")] {
mod riscv32;
pub use riscv32::*;
}
}
macro_rules! define_error_codes {
(
$(
$( #[$attr:meta] )*
$name:ident = $discr:literal,
)*
) => {
#[repr(u32)]
pub enum Error {
$(
$( #[$attr] )*
$name = $discr,
)*
Unknown,
}
impl From<ReturnCode> for Result {
#[inline]
fn from(return_code: ReturnCode) -> Self {
match return_code.0 {
0 => Ok(()),
$(
$discr => Err(Error::$name),
)*
_ => Err(Error::Unknown),
}
}
}
};
}
define_error_codes! {
CalleeTrapped = 1,
CalleeReverted = 2,
KeyNotFound = 3,
_BelowSubsistenceThreshold = 4,
TransferFailed = 5,
_EndowmentTooLow = 6,
CodeNotFound = 7,
NotCallable = 8,
LoggingDisabled = 9,
CallRuntimeFailed = 10,
EcdsaRecoveryFailed = 11,
}
#[derive(Debug, Encode)]
#[repr(transparent)]
pub struct Ptr32<'a, T>
where
T: ?Sized,
{
_value: u32,
marker: PhantomData<fn() -> &'a T>,
}
impl<'a, T> Ptr32<'a, T>
where
T: ?Sized,
{
fn new(value: u32) -> Self {
Self {
_value: value,
marker: Default::default(),
}
}
}
impl<'a, T> Ptr32<'a, [T]> {
pub fn from_slice(slice: &'a [T]) -> Self {
Self::new(slice.as_ptr() as u32)
}
}
#[derive(Debug, Encode)]
#[repr(transparent)]
pub struct Ptr32Mut<'a, T>
where
T: ?Sized,
{
_value: u32,
marker: PhantomData<fn() -> &'a mut T>,
}
impl<'a, T> Ptr32Mut<'a, T>
where
T: ?Sized,
{
fn new(value: u32) -> Self {
Self {
_value: value,
marker: Default::default(),
}
}
}
impl<'a, T> Ptr32Mut<'a, [T]> {
pub fn from_slice(slice: &'a mut [T]) -> Self {
Self::new(slice.as_ptr() as u32)
}
}
impl<'a, T> Ptr32Mut<'a, T>
where
T: Sized,
{
pub fn from_ref(a_ref: &'a mut T) -> Self {
let a_ptr: *mut T = a_ref;
Self::new(a_ptr as u32)
}
}
#[repr(transparent)]
pub struct ReturnCode(u32);
impl From<ReturnCode> for Option<u32> {
fn from(code: ReturnCode) -> Self {
const SENTINEL: u32 = u32::MAX;
(code.0 < SENTINEL).then_some(code.0)
}
}
impl ReturnCode {
pub fn into_u32(self) -> u32 {
self.0
}
pub fn into_bool(self) -> bool {
self.0.ne(&0)
}
}
type Result = core::result::Result<(), Error>;
#[inline(always)]
fn extract_from_slice(output: &mut &mut [u8], new_len: usize) {
debug_assert!(new_len <= output.len());
let tmp = core::mem::take(output);
*output = &mut tmp[..new_len];
}