collectives_westend_runtime/ambassador/
origins.rs1#[frame_support::pallet]
19pub mod pallet_origins {
20 use crate::ambassador::ranks;
21 use frame_support::pallet_prelude::*;
22 use pallet_ranked_collective::Rank;
23
24 #[pallet::pallet]
25 pub struct Pallet<T>(PhantomData<T>);
26
27 #[pallet::config]
29 pub trait Config: frame_system::Config {}
30
31 #[derive(
32 PartialEq,
33 Eq,
34 Clone,
35 MaxEncodedLen,
36 Encode,
37 Decode,
38 DecodeWithMemTracking,
39 TypeInfo,
40 RuntimeDebug,
41 )]
42 #[pallet::origin]
43 pub enum Origin {
44 Ambassadors,
47 AmbassadorsTier2,
50 SeniorAmbassadors,
53 SeniorAmbassadorsTier4,
56 HeadAmbassadors,
59 HeadAmbassadorsTier6,
62 HeadAmbassadorsTier7,
65 MasterAmbassadors,
68 MasterAmbassadorsTier9,
71 }
72
73 impl Origin {
74 pub fn as_voice(&self) -> Option<Rank> {
77 Some(match &self {
78 Origin::Ambassadors => ranks::AMBASSADOR_TIER_1,
79 Origin::AmbassadorsTier2 => ranks::AMBASSADOR_TIER_2,
80 Origin::SeniorAmbassadors => ranks::SENIOR_AMBASSADOR_TIER_3,
81 Origin::SeniorAmbassadorsTier4 => ranks::SENIOR_AMBASSADOR_TIER_4,
82 Origin::HeadAmbassadors => ranks::HEAD_AMBASSADOR_TIER_5,
83 Origin::HeadAmbassadorsTier6 => ranks::HEAD_AMBASSADOR_TIER_6,
84 Origin::HeadAmbassadorsTier7 => ranks::HEAD_AMBASSADOR_TIER_7,
85 Origin::MasterAmbassadors => ranks::MASTER_AMBASSADOR_TIER_8,
86 Origin::MasterAmbassadorsTier9 => ranks::MASTER_AMBASSADOR_TIER_9,
87 })
88 }
89 }
90
91 pub struct EnsureHeadAmbassadorsVoice;
93 impl<O: OriginTrait + From<Origin>> EnsureOrigin<O> for EnsureHeadAmbassadorsVoice
94 where
95 for<'a> &'a O::PalletsOrigin: TryInto<&'a Origin>,
96 {
97 type Success = ();
98 fn try_origin(o: O) -> Result<Self::Success, O> {
99 match o.caller().try_into() {
100 Ok(Origin::HeadAmbassadors) => return Ok(()),
101 _ => (),
102 }
103
104 Err(o)
105 }
106
107 #[cfg(feature = "runtime-benchmarks")]
108 fn try_successful_origin() -> Result<O, ()> {
109 Ok(O::from(Origin::HeadAmbassadors))
110 }
111 }
112
113 pub struct EnsureAmbassadorsVoiceFrom<R>(PhantomData<R>);
116 impl<R: Get<Rank>, O: OriginTrait + From<Origin>> EnsureOrigin<O> for EnsureAmbassadorsVoiceFrom<R>
117 where
118 for<'a> &'a O::PalletsOrigin: TryInto<&'a Origin>,
119 {
120 type Success = Rank;
121 fn try_origin(o: O) -> Result<Self::Success, O> {
122 match o.caller().try_into().map(|o| Origin::as_voice(o)) {
123 Ok(Some(r)) if r >= R::get() => return Ok(r),
124 _ => (),
125 }
126
127 Err(o)
128 }
129
130 #[cfg(feature = "runtime-benchmarks")]
131 fn try_successful_origin() -> Result<O, ()> {
132 ranks::MASTER_AMBASSADOR_TIER_9
133 .ge(&R::get())
134 .then(|| O::from(Origin::MasterAmbassadorsTier9))
135 .ok_or(())
136 }
137 }
138
139 pub struct EnsureAmbassadorsVoice;
142 impl<O: OriginTrait + From<Origin>> EnsureOrigin<O> for EnsureAmbassadorsVoice
143 where
144 for<'a> &'a O::PalletsOrigin: TryInto<&'a Origin>,
145 {
146 type Success = Rank;
147 fn try_origin(o: O) -> Result<Self::Success, O> {
148 match o.caller().try_into().map(|o| Origin::as_voice(o)) {
149 Ok(Some(r)) => return Ok(r),
150 _ => (),
151 }
152
153 Err(o)
154 }
155
156 #[cfg(feature = "runtime-benchmarks")]
157 fn try_successful_origin() -> Result<O, ()> {
158 Ok(O::from(Origin::MasterAmbassadorsTier9))
159 }
160 }
161}