1use serde::{Deserialize, Serialize};
4
5#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
7pub struct FormatterConfig {
8 pub line_length: usize,
10 pub tab_width: usize,
12 pub style: IndentStyle,
14 pub bracket_spacing: bool,
16 pub int_types: IntTypes,
18 pub multiline_func_header: MultilineFuncHeaderStyle,
20 pub quote_style: QuoteStyle,
22 pub number_underscore: NumberUnderscore,
24 pub hex_underscore: HexUnderscore,
26 pub single_line_statement_blocks: SingleLineBlockStyle,
28 pub override_spacing: bool,
30 pub wrap_comments: bool,
32 pub docs_style: DocCommentStyle,
34 pub ignore: Vec<String>,
36 pub contract_new_lines: bool,
38 pub sort_imports: bool,
40 pub pow_no_space: bool,
42 pub prefer_compact: PreferCompact,
45 pub single_line_imports: bool,
47}
48
49#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
51#[serde(rename_all = "snake_case")]
52pub enum IntTypes {
53 Preserve,
55 #[default]
57 Long,
58 Short,
60}
61
62#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
64#[serde(rename_all = "snake_case")]
65pub enum NumberUnderscore {
66 #[default]
68 Preserve,
69 Remove,
71 Thousands,
74}
75
76impl NumberUnderscore {
77 #[inline]
79 pub fn is_preserve(self) -> bool {
80 matches!(self, Self::Preserve)
81 }
82
83 #[inline]
85 pub fn is_remove(self) -> bool {
86 matches!(self, Self::Remove)
87 }
88
89 #[inline]
91 pub fn is_thousands(self) -> bool {
92 matches!(self, Self::Thousands)
93 }
94}
95
96#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
98#[serde(rename_all = "snake_case")]
99pub enum HexUnderscore {
100 Preserve,
102 #[default]
104 Remove,
105 Bytes,
107}
108
109#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
111#[serde(rename_all = "snake_case")]
112pub enum DocCommentStyle {
113 #[default]
115 Preserve,
116 Line,
118 Block,
120}
121
122#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
124#[serde(rename_all = "snake_case")]
125pub enum QuoteStyle {
126 Preserve,
128 #[default]
130 Double,
131 Single,
133}
134
135impl QuoteStyle {
136 pub const fn quote(self) -> Option<char> {
138 match self {
139 Self::Preserve => None,
140 Self::Double => Some('"'),
141 Self::Single => Some('\''),
142 }
143 }
144}
145
146#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
148#[serde(rename_all = "snake_case")]
149pub enum SingleLineBlockStyle {
150 #[default]
152 Preserve,
153 Single,
155 Multi,
157}
158
159#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
161#[serde(rename_all = "snake_case")]
162pub enum MultilineFuncHeaderStyle {
163 #[serde(alias = "params_first")] ParamsAlways,
166 ParamsFirstMulti,
168 #[default]
170 AttributesFirst,
171 All,
174 AllParams,
176}
177
178impl MultilineFuncHeaderStyle {
179 pub fn all(&self) -> bool {
180 matches!(self, Self::All | Self::AllParams)
181 }
182
183 pub fn params_first(&self) -> bool {
184 matches!(self, Self::ParamsAlways | Self::ParamsFirstMulti)
185 }
186
187 pub fn attrib_first(&self) -> bool {
188 matches!(self, Self::AttributesFirst)
189 }
190}
191
192#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
195#[serde(rename_all = "snake_case")]
196pub enum PreferCompact {
197 None,
199 Calls,
201 Events,
203 Errors,
205 EventsErrors,
207 #[default]
209 All,
210}
211
212impl PreferCompact {
213 pub fn calls(&self) -> bool {
214 matches!(self, Self::All | Self::Calls)
215 }
216
217 pub fn events(&self) -> bool {
218 matches!(self, Self::All | Self::Events | Self::EventsErrors)
219 }
220
221 pub fn errors(&self) -> bool {
222 matches!(self, Self::All | Self::Errors | Self::EventsErrors)
223 }
224}
225
226#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
228#[serde(rename_all = "snake_case")]
229pub enum IndentStyle {
230 #[default]
231 Space,
232 Tab,
233}
234
235impl Default for FormatterConfig {
236 fn default() -> Self {
237 Self {
238 line_length: 120,
239 tab_width: 4,
240 style: IndentStyle::Space,
241 bracket_spacing: false,
242 int_types: IntTypes::default(),
243 multiline_func_header: MultilineFuncHeaderStyle::default(),
244 quote_style: QuoteStyle::default(),
245 number_underscore: NumberUnderscore::default(),
246 hex_underscore: HexUnderscore::default(),
247 single_line_statement_blocks: SingleLineBlockStyle::default(),
248 override_spacing: false,
249 wrap_comments: false,
250 ignore: vec![],
251 contract_new_lines: false,
252 sort_imports: false,
253 pow_no_space: false,
254 prefer_compact: PreferCompact::default(),
255 docs_style: DocCommentStyle::default(),
256 single_line_imports: false,
257 }
258 }
259}