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