frame_support_procedural/pallet/parse/
origin.rs1use super::helper;
19use syn::spanned::Spanned;
20
21pub struct OriginDef {
28 pub is_generic: bool,
29 pub instances: Vec<helper::InstanceUsage>,
31}
32
33impl OriginDef {
34 pub fn try_from(item: &mut syn::Item) -> syn::Result<Self> {
35 let item_span = item.span();
36 let (vis, ident, generics) = match &item {
37 syn::Item::Enum(item) => (&item.vis, &item.ident, &item.generics),
38 syn::Item::Struct(item) => (&item.vis, &item.ident, &item.generics),
39 syn::Item::Type(item) => (&item.vis, &item.ident, &item.generics),
40 _ => {
41 let msg = "Invalid pallet::origin, expected enum or struct or type";
42 return Err(syn::Error::new(item.span(), msg))
43 },
44 };
45
46 let is_generic = !generics.params.is_empty();
47
48 let mut instances = vec![];
49 if let Some(u) = helper::check_type_def_optional_gen(generics, item.span())? {
50 instances.push(u);
51 } else {
52 instances.push(helper::InstanceUsage { has_instance: false, span: ident.span() })
54 }
55
56 if !matches!(vis, syn::Visibility::Public(_)) {
57 let msg = "Invalid pallet::origin, Origin must be public";
58 return Err(syn::Error::new(item_span, msg))
59 }
60
61 if ident != "Origin" {
62 let msg = "Invalid pallet::origin, ident must `Origin`";
63 return Err(syn::Error::new(ident.span(), msg))
64 }
65
66 Ok(OriginDef { is_generic, instances })
67 }
68}