#![cfg_attr(not(feature = "std"), no_std)]
use frame_support::{decl_module, decl_storage, decl_event, decl_error, dispatch, traits::Get};
use frame_system::ensure_signed;
#[cfg(test)]
mod mock;
#[cfg(test)]
mod tests;
pub trait Config: frame_system::Config {
type Event: From<Event<Self>> + Into<<Self as frame_system::Config>::Event>;
}
decl_storage! {
trait Store for Module<T: Config> as TemplateModule {
Something get(fn something): Option<u32>;
}
}
decl_event!(
pub enum Event<T> where AccountId = <T as frame_system::Config>::AccountId {
SomethingStored(u32, AccountId),
}
);
decl_error! {
pub enum Error for Module<T: Config> {
NoneValue,
StorageOverflow,
}
}
decl_module! {
pub struct Module<T: Config> for enum Call where origin: T::Origin {
type Error = Error<T>;
fn deposit_event() = default;
#[weight = 10_000 + T::DbWeight::get().writes(1)]
pub fn do_something(origin, something: u32) -> dispatch::DispatchResult {
let who = ensure_signed(origin)?;
Something::put(something);
Self::deposit_event(RawEvent::SomethingStored(something, who));
Ok(())
}
#[weight = 10_000 + T::DbWeight::get().reads_writes(1,1)]
pub fn cause_error(origin) -> dispatch::DispatchResult {
let _who = ensure_signed(origin)?;
match Something::get() {
None => Err(Error::<T>::NoneValue)?,
Some(old) => {
let new = old.checked_add(1).ok_or(Error::<T>::StorageOverflow)?;
Something::put(new);
Ok(())
},
}
}
}
}