use core::marker::PhantomData;
use ink_primitives::{
reflect::{
AbiDecodeWith,
ScaleEncoding,
SolEncoding,
},
MessageResult,
SolDecode,
};
use scale::{
Decode,
DecodeAll,
};
#[derive(Debug)]
pub struct ReturnType<T>(PhantomData<fn() -> T>);
impl<T> Clone for ReturnType<T> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<T> Copy for ReturnType<T> {}
impl<T> Default for ReturnType<T> {
#[inline]
fn default() -> Self {
Self(Default::default())
}
}
#[derive(Debug, Copy, Clone)]
pub struct Set<T>(pub T);
impl<T> Set<T> {
#[inline]
pub fn value(self) -> T {
self.0
}
}
#[derive(Debug)]
pub struct Unset<T>(PhantomData<fn() -> T>);
impl<T> Clone for Unset<T> {
#[inline]
fn clone(&self) -> Self {
*self
}
}
impl<T> Copy for Unset<T> {}
impl<T> Default for Unset<T> {
#[inline]
fn default() -> Self {
Self(Default::default())
}
}
pub trait Unwrap {
type Output;
fn unwrap_or_else<F>(self, f: F) -> Self::Output
where
F: FnOnce() -> Self::Output;
}
impl<T> Unwrap for Unset<T> {
type Output = T;
#[inline]
fn unwrap_or_else<F>(self, f: F) -> Self::Output
where
F: FnOnce() -> Self::Output,
{
f()
}
}
impl<T> Unwrap for Set<T> {
type Output = T;
#[inline]
fn unwrap_or_else<F>(self, _: F) -> Self::Output
where
F: FnOnce() -> Self::Output,
{
self.value()
}
}
pub trait DecodeMessageResult<Abi>: Sized {
fn decode_output(buffer: &[u8]) -> crate::Result<MessageResult<Self>>;
}
impl<R> DecodeMessageResult<ScaleEncoding> for R
where
R: Decode,
MessageResult<R>: Decode,
{
fn decode_output(mut buffer: &[u8]) -> crate::Result<MessageResult<Self>> {
let decoded = MessageResult::<R>::decode_all(&mut buffer)?;
Ok(decoded)
}
}
impl<R> DecodeMessageResult<SolEncoding> for R
where
R: SolDecode,
{
fn decode_output(buffer: &[u8]) -> crate::Result<MessageResult<Self>> {
let decoded = R::decode_with(buffer)?;
Ok(Ok(decoded))
}
}