1use {
5 crate::{
6 attr::{self, WithOuterAttributes},
7 expr::Expression,
8 token,
9 util::{Braced, Parenthesized},
10 vis::Visibility,
11 },
12 super::{
13 function::{GenericParams, WhereClause},
14 struct_::{StructFields, TupleFields, TupleStruct},
15 },
16 rustidy_ast_util::{Identifier, PunctuatedTrailing, delimited, punct},
17 rustidy_format::{Format, Formattable, WhitespaceFormat},
18 rustidy_parse::Parse,
19 rustidy_print::Print,
20 rustidy_util::Whitespace,
21};
22
23#[derive(PartialEq, Eq, Clone, Debug)]
25#[derive(serde::Serialize, serde::Deserialize)]
26#[derive(Parse, Formattable, Format, Print)]
27pub struct Enumeration {
28 pub enum_: token::Enum,
29 #[parse(fatal)]
30 #[format(prefix_ws = Whitespace::SINGLE)]
31 pub ident: Identifier,
32 #[format(prefix_ws = Whitespace::REMOVE)]
33 pub generic: Option<GenericParams>,
34 #[format(prefix_ws = Whitespace::INDENT)]
35 pub where_: Option<WhereClause>,
36 #[format(prefix_ws = Whitespace::SINGLE)]
37 #[format(args = delimited::fmt_indent_if_non_blank())]
38 pub variants: Braced<Option<EnumVariants>>,
39}
40
41#[derive(PartialEq, Eq, Clone, Debug)]
43#[derive(serde::Serialize, serde::Deserialize)]
44#[derive(Parse, Formattable, Format, Print)]
45pub struct EnumVariants(
46 #[format(args = punct::fmt(Whitespace::INDENT, Whitespace::REMOVE))]
47 pub PunctuatedTrailing<EnumVariant, token::Comma>,
48);
49
50#[derive(PartialEq, Eq, Clone, Debug)]
52#[derive(serde::Serialize, serde::Deserialize)]
53#[derive(Parse, Formattable, Format, Print)]
54pub struct EnumVariant(
55 #[format(args = attr::with::fmt(Whitespace::INDENT))]
56 pub WithOuterAttributes<EnumVariantInner>,
57);
58
59#[derive(PartialEq, Eq, Clone, Debug)]
60#[derive(serde::Serialize, serde::Deserialize)]
61#[derive(Parse, Formattable, Format, Print)]
62pub struct EnumVariantInner {
63 pub vis: Option<Visibility>,
64 #[format(prefix_ws(expr = Whitespace::SINGLE, if_ = self.vis.is_some()))]
65 pub ident: Identifier,
66 #[format(prefix_ws(if_ = let Some(kind) = &self.kind, expr = match kind {
67 EnumVariantKind::Tuple(_) => Whitespace::REMOVE,
68 EnumVariantKind::Struct(_) => Whitespace::SINGLE,
69 }))]
70 pub kind: Option<EnumVariantKind>,
71 #[format(prefix_ws = Whitespace::SINGLE)]
72 pub discriminant: Option<EnumVariantDiscriminant>,
73}
74
75#[derive(PartialEq, Eq, Clone, Debug)]
76#[derive(serde::Serialize, serde::Deserialize)]
77#[derive(Parse, Formattable, Format, Print)]
78pub enum EnumVariantKind {
79 Tuple(EnumVariantTuple),
80 Struct(EnumVariantStruct),
81}
82
83#[derive(PartialEq, Eq, Clone, Debug)]
85#[derive(serde::Serialize, serde::Deserialize)]
86#[derive(Parse, Formattable, Format, Print)]
87pub struct EnumVariantTuple(
88 #[format(with = TupleStruct::format_fields)]
89 pub Parenthesized<Option<TupleFields>>,
90);
91
92#[derive(PartialEq, Eq, Clone, Debug)]
94#[derive(serde::Serialize, serde::Deserialize)]
95#[derive(Parse, Formattable, Format, Print)]
96pub struct EnumVariantStruct(
97 #[format(args = delimited::fmt_indent_if_non_blank())]
99 pub Braced<Option<StructFields>>,
100);
101
102#[derive(PartialEq, Eq, Clone, Debug)]
104#[derive(serde::Serialize, serde::Deserialize)]
105#[derive(Parse, Formattable, Format, Print)]
106pub struct EnumVariantDiscriminant {
107 pub eq: token::Eq,
108 #[format(prefix_ws = Whitespace::SINGLE)]
109 pub expr: Expression,
110}