12345678910111213141516171819#[cfg(not(feature = "std"))]20use alloc::string::{String, ToString};21use evm_core::{ExitError, ExitFatal};22#[cfg(feature = "std")]23use std::string::{String, ToString};2425use crate::Weight;262728#[derive(Debug, Clone)]29pub enum Error {30 31 Revert(String),32 33 Fatal(ExitFatal),34 35 Error(ExitError),36}3738impl<E> From<E> for Error39where40 E: ToString,41{42 fn from(e: E) -> Self {43 Self::Revert(e.to_string())44 }45}464748pub type Result<T> = core::result::Result<T, Error>;495051pub struct DispatchInfo {52 53 pub weight: Weight,54}5556impl From<Weight> for DispatchInfo {57 fn from(weight: Weight) -> Self {58 Self { weight }59 }60}61impl From<u64> for DispatchInfo {62 fn from(weight: u64) -> Self {63 Self { weight: Weight::from_ref_time(weight) }64 }65}66impl From<()> for DispatchInfo {67 fn from(_: ()) -> Self {68 Self { weight: Weight::zero() }69 }70}71727374#[derive(Default, Clone)]75pub struct PostDispatchInfo {76 77 actual_weight: Option<Weight>,78}7980impl PostDispatchInfo {81 82 pub fn calc_unspent(&self, info: &DispatchInfo) -> Weight {83 info.weight - self.calc_actual_weight(info)84 }8586 87 88 pub fn calc_actual_weight(&self, info: &DispatchInfo) -> Weight {89 if let Some(actual_weight) = self.actual_weight {90 actual_weight.min(info.weight)91 } else {92 info.weight93 }94 }95}969798#[derive(Clone)]99pub struct WithPostDispatchInfo<T> {100 101 pub data: T,102 103 pub post_info: PostDispatchInfo,104}105106impl<T> From<T> for WithPostDispatchInfo<T> {107 fn from(data: T) -> Self {108 Self {109 data,110 post_info: Default::default(),111 }112 }113}114115116pub type ResultWithPostInfo<T> =117 core::result::Result<WithPostDispatchInfo<T>, WithPostDispatchInfo<Error>>;