123use frame_support::{4 dispatch::{5 DispatchResultWithPostInfo, PostDispatchInfo, Weight, DispatchErrorWithPostInfo,6 DispatchResult,7 },8 weights::Pays,9 traits::Get,10};11use sp_runtime::DispatchError;12use up_data_structs::{CollectionId, CreateCollectionData};1314use crate::{pallet::Config, CommonCollectionOperations, CollectionHandle};15161718pub fn dispatch_weight<T: Config>() -> Weight {19 20 <T as frame_system::Config>::DbWeight::get().reads(1)21 22 + Weight::from_ref_time(6_000_000)23 24}252627282930pub fn dispatch_tx<31 T: Config,32 C: FnOnce(&dyn CommonCollectionOperations<T>) -> DispatchResultWithPostInfo,33>(34 collection: CollectionId,35 call: C,36) -> DispatchResultWithPostInfo {37 let handle =38 CollectionHandle::try_get(collection).map_err(|error| DispatchErrorWithPostInfo {39 post_info: PostDispatchInfo {40 actual_weight: Some(dispatch_weight::<T>()),41 pays_fee: Pays::Yes,42 },43 error,44 })?;45 handle46 .check_is_internal()47 .map_err(|error| DispatchErrorWithPostInfo {48 post_info: PostDispatchInfo {49 actual_weight: Some(dispatch_weight::<T>()),50 pays_fee: Pays::Yes,51 },52 error,53 })?;54 let dispatched = T::CollectionDispatch::dispatch(handle);55 let mut result = call(dispatched.as_dyn());56 match &mut result {57 Ok(PostDispatchInfo {58 actual_weight: Some(weight),59 ..60 })61 | Err(DispatchErrorWithPostInfo {62 post_info: PostDispatchInfo {63 actual_weight: Some(weight),64 ..65 },66 ..67 }) => *weight += dispatch_weight::<T>(),68 _ => {}69 }70 result71}727374pub trait CollectionDispatch<T: Config> {75 76 77 78 79 fn create(80 sender: T::CrossAccountId,81 payer: T::CrossAccountId,82 data: CreateCollectionData<T::AccountId>,83 ) -> Result<CollectionId, DispatchError>;8485 86 87 88 89 fn destroy(sender: T::CrossAccountId, handle: CollectionHandle<T>) -> DispatchResult;9091 92 93 94 fn dispatch(handle: CollectionHandle<T>) -> Self;9596 97 fn into_inner(self) -> CollectionHandle<T>;9899 100 fn as_dyn(&self) -> &dyn CommonCollectionOperations<T>;101}