referrerpolicy=no-referrer-when-downgrade

frame_support_procedural/pallet/parse/
inherent.rs

1// This file is part of Substrate.
2
3// Copyright (C) Parity Technologies (UK) Ltd.
4// SPDX-License-Identifier: Apache-2.0
5
6// Licensed under the Apache License, Version 2.0 (the "License");
7// you may not use this file except in compliance with the License.
8// You may obtain a copy of the License at
9//
10// 	http://www.apache.org/licenses/LICENSE-2.0
11//
12// Unless required by applicable law or agreed to in writing, software
13// distributed under the License is distributed on an "AS IS" BASIS,
14// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15// See the License for the specific language governing permissions and
16// limitations under the License.
17
18use super::helper;
19use syn::spanned::Spanned;
20
21/// The definition of the pallet inherent implementation.
22pub struct InherentDef {
23	/// A set of usage of instance, must be check for consistency with trait.
24	pub instances: Vec<helper::InstanceUsage>,
25}
26
27impl InherentDef {
28	pub fn try_from(item: &mut syn::Item) -> syn::Result<Self> {
29		let item = if let syn::Item::Impl(item) = item {
30			item
31		} else {
32			let msg = "Invalid pallet::inherent, expected item impl";
33			return Err(syn::Error::new(item.span(), msg))
34		};
35
36		if item.trait_.is_none() {
37			let msg = "Invalid pallet::inherent, expected impl<..> ProvideInherent for Pallet<..>";
38			return Err(syn::Error::new(item.span(), msg))
39		}
40
41		if let Some(last) = item.trait_.as_ref().unwrap().1.segments.last() {
42			if last.ident != "ProvideInherent" {
43				let msg = "Invalid pallet::inherent, expected trait ProvideInherent";
44				return Err(syn::Error::new(last.span(), msg))
45			}
46		} else {
47			let msg = "Invalid pallet::inherent, expected impl<..> ProvideInherent for Pallet<..>";
48			return Err(syn::Error::new(item.span(), msg))
49		}
50
51		let instances = vec![
52			helper::check_pallet_struct_usage(&item.self_ty)?,
53			helper::check_impl_gen(&item.generics, item.impl_token.span())?,
54		];
55
56		Ok(InherentDef { instances })
57	}
58}