syn_solidity/item/
error.rs1use crate::{ParameterList, SolIdent, Spanned, Type, kw};
2use proc_macro2::Span;
3use std::fmt;
4use syn::{
5 Attribute, Result, Token, parenthesized,
6 parse::{Parse, ParseStream},
7 token::Paren,
8};
9
10#[derive(Clone)]
15pub struct ItemError {
16 pub attrs: Vec<Attribute>,
17 pub error_token: kw::error,
18 pub name: SolIdent,
19 pub paren_token: Paren,
20 pub parameters: ParameterList,
21 pub semi_token: Token![;],
22}
23
24impl fmt::Display for ItemError {
25 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
26 write!(f, "error {}({});", self.name, self.parameters)
27 }
28}
29
30impl fmt::Debug for ItemError {
31 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
32 f.debug_struct("ItemError")
33 .field("attrs", &self.attrs)
34 .field("name", &self.name)
35 .field("fields", &self.parameters)
36 .finish()
37 }
38}
39
40impl Parse for ItemError {
41 fn parse(input: ParseStream<'_>) -> Result<Self> {
42 let content;
43 Ok(Self {
44 attrs: input.call(Attribute::parse_outer)?,
45 error_token: input.parse()?,
46 name: input.parse()?,
47 paren_token: parenthesized!(content in input),
48 parameters: content.parse()?,
49 semi_token: input.parse()?,
50 })
51 }
52}
53
54impl Spanned for ItemError {
55 fn span(&self) -> Span {
56 self.name.span()
57 }
58
59 fn set_span(&mut self, span: Span) {
60 self.name.set_span(span);
61 }
62}
63
64impl ItemError {
65 pub fn as_type(&self) -> Type {
66 let mut ty = Type::Tuple(self.parameters.types().cloned().collect());
67 ty.set_span(self.span());
68 ty
69 }
70}