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 namespace_import_style: NamespaceImportStyle,
42 pub pow_no_space: bool,
44 pub prefer_compact: PreferCompact,
47 pub single_line_imports: bool,
49}
50
51#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
53#[serde(rename_all = "snake_case")]
54pub enum IntTypes {
55 Preserve,
57 #[default]
59 Long,
60 Short,
62}
63
64#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
66#[serde(rename_all = "snake_case")]
67pub enum NumberUnderscore {
68 #[default]
70 Preserve,
71 Remove,
73 Thousands,
76}
77
78impl NumberUnderscore {
79 #[inline]
81 pub fn is_preserve(self) -> bool {
82 matches!(self, Self::Preserve)
83 }
84
85 #[inline]
87 pub fn is_remove(self) -> bool {
88 matches!(self, Self::Remove)
89 }
90
91 #[inline]
93 pub fn is_thousands(self) -> bool {
94 matches!(self, Self::Thousands)
95 }
96}
97
98#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
100#[serde(rename_all = "snake_case")]
101pub enum HexUnderscore {
102 Preserve,
104 #[default]
106 Remove,
107 Bytes,
109}
110
111#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
113#[serde(rename_all = "snake_case")]
114pub enum DocCommentStyle {
115 #[default]
117 Preserve,
118 Line,
120 Block,
122}
123
124#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
126#[serde(rename_all = "snake_case")]
127pub enum QuoteStyle {
128 Preserve,
130 #[default]
132 Double,
133 Single,
135}
136
137impl QuoteStyle {
138 pub const fn quote(self) -> Option<char> {
140 match self {
141 Self::Preserve => None,
142 Self::Double => Some('"'),
143 Self::Single => Some('\''),
144 }
145 }
146}
147
148#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
150#[serde(rename_all = "snake_case")]
151pub enum SingleLineBlockStyle {
152 #[default]
154 Preserve,
155 Single,
157 Multi,
159}
160
161#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
163#[serde(rename_all = "snake_case")]
164pub enum MultilineFuncHeaderStyle {
165 #[serde(alias = "params_first")] ParamsAlways,
168 ParamsFirstMulti,
170 #[default]
172 AttributesFirst,
173 All,
176 AllParams,
178}
179
180impl MultilineFuncHeaderStyle {
181 pub fn all(&self) -> bool {
182 matches!(self, Self::All | Self::AllParams)
183 }
184
185 pub fn params_first(&self) -> bool {
186 matches!(self, Self::ParamsAlways | Self::ParamsFirstMulti)
187 }
188
189 pub fn attrib_first(&self) -> bool {
190 matches!(self, Self::AttributesFirst)
191 }
192}
193
194#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
195#[serde(rename_all = "snake_case")]
196pub enum NamespaceImportStyle {
197 #[default]
199 PreferPlain,
200 PreferGlob,
202 Preserve,
204}
205
206#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
209#[serde(rename_all = "snake_case")]
210pub enum PreferCompact {
211 None,
213 Calls,
215 Events,
217 Errors,
219 EventsErrors,
221 #[default]
223 All,
224}
225
226impl PreferCompact {
227 pub fn calls(&self) -> bool {
228 matches!(self, Self::All | Self::Calls)
229 }
230
231 pub fn events(&self) -> bool {
232 matches!(self, Self::All | Self::Events | Self::EventsErrors)
233 }
234
235 pub fn errors(&self) -> bool {
236 matches!(self, Self::All | Self::Errors | Self::EventsErrors)
237 }
238}
239
240#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
242#[serde(rename_all = "snake_case")]
243pub enum IndentStyle {
244 #[default]
245 Space,
246 Tab,
247}
248
249impl Default for FormatterConfig {
250 fn default() -> Self {
251 Self {
252 line_length: 120,
253 tab_width: 4,
254 style: IndentStyle::Space,
255 bracket_spacing: false,
256 int_types: IntTypes::default(),
257 multiline_func_header: MultilineFuncHeaderStyle::default(),
258 quote_style: QuoteStyle::default(),
259 number_underscore: NumberUnderscore::default(),
260 hex_underscore: HexUnderscore::default(),
261 single_line_statement_blocks: SingleLineBlockStyle::default(),
262 override_spacing: false,
263 wrap_comments: false,
264 ignore: vec![],
265 contract_new_lines: false,
266 sort_imports: false,
267 namespace_import_style: NamespaceImportStyle::default(),
268 pow_no_space: false,
269 prefer_compact: PreferCompact::default(),
270 docs_style: DocCommentStyle::default(),
271 single_line_imports: false,
272 }
273 }
274}