• Sam Johnson's avatar
    Tasks: general system for recognizing and executing service work (#1343) · ac3f14d2
    Sam Johnson authored
    `polkadot-sdk` version of original tasks PR located here:
    https://github.com/paritytech/substrate/pull/14329
    
    Fixes #206
    
    ## Status
    - [x] Generic `Task` trait
    - [x] `RuntimeTask` aggregated enum, compatible with
    `construct_runtime!`
    - [x] Casting between `Task` and `RuntimeTask` without needing `dyn` or
    `Box`
    - [x] Tasks Example pallet
    - [x] Runtime tests for Tasks example pallet
    - [x] Parsing for task-related macros
    - [x] Retrofit parsing to make macros optional
    - [x] Expansion for task-related macros
    - [x] Adds support for args in tasks
    - [x] Retrofit tasks example pallet to use macros instead of manual
    syntax
    - [x] Weights
    - [x] Cleanup
    - [x] UI tests
    - [x] Docs
    
    ## Target Syntax
    Adapted from
    https://github.com/paritytech/polkadot-sdk/issues/206#issue-1865172283
    
    
    
    ```rust
    // NOTE: this enum is optional and is auto-generated by the other macros if not present
    #[pallet::task]
    pub enum Task<T: Config> {
        AddNumberIntoTotal {
            i: u32,
        }
    }
    
    /// Some running total.
    #[pallet::storage]
    pub(super) type Total<T: Config<I>, I: 'static = ()> =
    StorageValue<_, (u32, u32), ValueQuery>;
    
    /// Numbers to be added into the total.
    #[pallet::storage]
    pub(super) type Numbers<T: Config<I>, I: 'static = ()> =
    StorageMap<_, Twox64Concat, u32, u32, OptionQuery>;
    
    #[pallet::tasks_experimental]
    impl<T: Config<I>, I: 'static> Pallet<T, I> {
    	/// Add a pair of numbers into the totals and remove them.
    	#[pallet::task_list(Numbers::<T, I>::iter_keys())]
    	#[pallet::task_condition(|i| Numbers::<T, I>::contains_key(i))]
    	#[pallet::task_index(0)]
    	pub fn add_number_into_total(i: u32) -> DispatchResult {
    		let v = Numbers::<T, I>::take(i).ok_or(Error::<T, I>::NotFound)?;
    		Total::<T, I>::mutate(|(total_keys, total_values)| {
    			*total_keys += i;
    			*total_values += v;
    		});
    		Ok(())
    	}
    }
    ```
    
    ---------
    
    Co-authored-by: default avatarNikhil Gupta <[email protected]>
    Co-authored-by: default avatarkianenigma <[email protected]>
    Co-authored-by: Nikhil Gupta <>
    Co-authored-by: default avatarGavin Wood <[email protected]>
    Co-authored-by: default avatarOliver Tale-Yazdi <[email protected]>
    Co-authored-by: default avatargupnik <[email protected]>
    ac3f14d2