1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
//! Configuration specific to the `forge fmt` command and the `forge_fmt` package
use serde::{Deserialize, Serialize};
/// Contains the config and rule set
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FormatterConfig {
/// Maximum line length where formatter will try to wrap the line
pub line_length: usize,
/// Number of spaces per indentation level
pub tab_width: usize,
/// Print spaces between brackets
pub bracket_spacing: bool,
/// Style of uint/int256 types
pub int_types: IntTypes,
/// Style of multiline function header in case it doesn't fit
pub multiline_func_header: MultilineFuncHeaderStyle,
/// Style of quotation marks
pub quote_style: QuoteStyle,
/// Style of underscores in number literals
pub number_underscore: NumberUnderscore,
/// Style of single line blocks in statements
pub single_line_statement_blocks: SingleLineBlockStyle,
/// Print space in state variable, function and modifier `override` attribute
pub override_spacing: bool,
/// Wrap comments on `line_length` reached
pub wrap_comments: bool,
/// Globs to ignore
pub ignore: Vec<String>,
/// Add new line at start and end of contract declarations
pub contract_new_lines: bool,
}
/// Style of uint/int256 types
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum IntTypes {
/// Print the explicit uint256 or int256
Long,
/// Print the implicit uint or int
Short,
/// Use the type defined in the source code
Preserve,
}
/// Style of underscores in number literals
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum NumberUnderscore {
/// Remove all underscores
Remove,
/// Add an underscore every thousand, if greater than 9999
/// e.g. 1000 -> 1000 and 10000 -> 10_000
Thousands,
/// Use the underscores defined in the source code
Preserve,
}
/// Style of string quotes
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum QuoteStyle {
/// Use double quotes where possible
Double,
/// Use single quotes where possible
Single,
/// Use quotation mark defined in the source code
Preserve,
}
impl QuoteStyle {
/// Get associated quotation mark with option
pub fn quote(self) -> Option<char> {
match self {
QuoteStyle::Double => Some('"'),
QuoteStyle::Single => Some('\''),
QuoteStyle::Preserve => None,
}
}
}
/// Style of single line blocks in statements
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SingleLineBlockStyle {
/// Prefer single line block when possible
Single,
/// Always use multiline block
Multi,
/// Preserve the original style
Preserve,
}
/// Style of function header in case it doesn't fit
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum MultilineFuncHeaderStyle {
/// Write function parameters multiline first
ParamsFirst,
/// Write function attributes multiline first
AttributesFirst,
/// If function params or attrs are multiline
/// split the rest
All,
}
impl Default for FormatterConfig {
fn default() -> Self {
FormatterConfig {
line_length: 120,
tab_width: 4,
bracket_spacing: false,
int_types: IntTypes::Long,
multiline_func_header: MultilineFuncHeaderStyle::AttributesFirst,
quote_style: QuoteStyle::Double,
number_underscore: NumberUnderscore::Preserve,
single_line_statement_blocks: SingleLineBlockStyle::Preserve,
override_spacing: false,
wrap_comments: false,
ignore: vec![],
contract_new_lines: false,
}
}
}