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 call_compact_args: bool,
44}
45
46#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
48#[serde(rename_all = "snake_case")]
49pub enum IntTypes {
50 Preserve,
52 #[default]
54 Long,
55 Short,
57}
58
59#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
61#[serde(rename_all = "snake_case")]
62pub enum NumberUnderscore {
63 #[default]
65 Preserve,
66 Remove,
68 Thousands,
71}
72
73impl NumberUnderscore {
74 #[inline]
76 pub fn is_preserve(self) -> bool {
77 matches!(self, Self::Preserve)
78 }
79
80 #[inline]
82 pub fn is_remove(self) -> bool {
83 matches!(self, Self::Remove)
84 }
85
86 #[inline]
88 pub fn is_thousands(self) -> bool {
89 matches!(self, Self::Thousands)
90 }
91}
92
93#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
95#[serde(rename_all = "snake_case")]
96pub enum HexUnderscore {
97 Preserve,
99 #[default]
101 Remove,
102 Bytes,
104}
105
106#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
108#[serde(rename_all = "snake_case")]
109pub enum DocCommentStyle {
110 #[default]
112 Preserve,
113 Line,
115 Block,
117}
118
119#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
121#[serde(rename_all = "snake_case")]
122pub enum QuoteStyle {
123 Preserve,
125 #[default]
127 Double,
128 Single,
130}
131
132impl QuoteStyle {
133 pub const fn quote(self) -> Option<char> {
135 match self {
136 Self::Preserve => None,
137 Self::Double => Some('"'),
138 Self::Single => Some('\''),
139 }
140 }
141}
142
143#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
145#[serde(rename_all = "snake_case")]
146pub enum SingleLineBlockStyle {
147 #[default]
149 Preserve,
150 Single,
152 Multi,
154}
155
156#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
158#[serde(rename_all = "snake_case")]
159pub enum MultilineFuncHeaderStyle {
160 #[serde(alias = "params_first")] ParamsAlways,
163 ParamsFirstMulti,
165 #[default]
167 AttributesFirst,
168 All,
171 AllParams,
173}
174
175impl MultilineFuncHeaderStyle {
176 pub fn all(&self) -> bool {
177 matches!(self, Self::All | Self::AllParams)
178 }
179
180 pub fn params_first(&self) -> bool {
181 matches!(self, Self::ParamsAlways | Self::ParamsFirstMulti)
182 }
183
184 pub fn attrib_first(&self) -> bool {
185 matches!(self, Self::AttributesFirst)
186 }
187}
188
189#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
191#[serde(rename_all = "snake_case")]
192pub enum IndentStyle {
193 #[default]
194 Space,
195 Tab,
196}
197
198impl Default for FormatterConfig {
199 fn default() -> Self {
200 Self {
201 line_length: 120,
202 tab_width: 4,
203 style: IndentStyle::Space,
204 bracket_spacing: false,
205 int_types: IntTypes::default(),
206 multiline_func_header: MultilineFuncHeaderStyle::default(),
207 quote_style: QuoteStyle::default(),
208 number_underscore: NumberUnderscore::default(),
209 hex_underscore: HexUnderscore::default(),
210 single_line_statement_blocks: SingleLineBlockStyle::default(),
211 override_spacing: false,
212 wrap_comments: false,
213 ignore: vec![],
214 contract_new_lines: false,
215 sort_imports: false,
216 pow_no_space: false,
217 call_compact_args: true,
218 docs_style: DocCommentStyle::default(),
219 }
220 }
221}