Skip to main content

rustidy_ast/item/
enum_.rs

1//! Enums
2
3// Imports
4use {
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/// `Enumeration`
24#[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/// `EnumVariants`
42#[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/// `EnumVariant`
51#[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/// `EnumVariantTuple`
84#[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/// `EnumVariantStruct`
93#[derive(PartialEq, Eq, Clone, Debug)]
94#[derive(serde::Serialize, serde::Deserialize)]
95#[derive(Parse, Formattable, Format, Print)]
96pub struct EnumVariantStruct(
97	// TODO: Use `delimited::fmt_single_or_indent_if_non_blank`
98	#[format(args = delimited::fmt_indent_if_non_blank())]
99	pub Braced<Option<StructFields>>,
100);
101
102/// `EnumVariantDiscriminant`
103#[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}