use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FormatOptions {
#[serde(default = "default_print_width")]
pub print_width: u32,
#[serde(default = "default_tab_width")]
pub tab_width: u8,
#[serde(default)]
pub use_tabs: bool,
#[serde(default = "default_true")]
pub semi: bool,
#[serde(default)]
pub single_quote: bool,
#[serde(default)]
pub jsx_single_quote: bool,
#[serde(default)]
pub trailing_comma: TrailingComma,
#[serde(default = "default_true")]
pub bracket_spacing: bool,
#[serde(default)]
pub bracket_same_line: bool,
#[serde(default)]
pub arrow_parens: ArrowParens,
#[serde(default)]
pub end_of_line: EndOfLine,
#[serde(default)]
pub quote_props: QuoteProps,
#[serde(default)]
pub single_attribute_per_line: bool,
#[serde(default)]
pub vue_indent_script_and_style: bool,
}
impl Default for FormatOptions {
fn default() -> Self {
Self {
print_width: default_print_width(),
tab_width: default_tab_width(),
use_tabs: false,
semi: true,
single_quote: false,
jsx_single_quote: false,
trailing_comma: TrailingComma::default(),
bracket_spacing: true,
bracket_same_line: false,
arrow_parens: ArrowParens::default(),
end_of_line: EndOfLine::default(),
quote_props: QuoteProps::default(),
single_attribute_per_line: false,
vue_indent_script_and_style: false,
}
}
}
fn default_print_width() -> u32 {
100
}
fn default_tab_width() -> u8 {
2
}
fn default_true() -> bool {
true
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum TrailingComma {
None,
Es5,
#[default]
All,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ArrowParens {
#[default]
Always,
Avoid,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum EndOfLine {
#[default]
Lf,
Crlf,
Cr,
Auto,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum QuoteProps {
#[default]
AsNeeded,
Consistent,
Preserve,
}
impl FormatOptions {
#[inline]
pub fn prettier_compat() -> Self {
Self {
print_width: 80,
..Default::default()
}
}
#[inline]
pub fn indent_string(&self) -> String {
if self.use_tabs {
"\t".to_string()
} else {
" ".repeat(self.tab_width as usize)
}
}
#[inline]
pub fn indent_bytes(&self) -> &'static [u8] {
if self.use_tabs {
b"\t"
} else {
match self.tab_width {
1 => b" ",
2 => b" ",
4 => b" ",
8 => b" ",
_ => b" ", }
}
}
#[inline]
pub fn newline_string(&self) -> &'static str {
match self.end_of_line {
EndOfLine::Lf | EndOfLine::Auto => "\n",
EndOfLine::Crlf => "\r\n",
EndOfLine::Cr => "\r",
}
}
#[inline]
pub fn newline_bytes(&self) -> &'static [u8] {
match self.end_of_line {
EndOfLine::Lf | EndOfLine::Auto => b"\n",
EndOfLine::Crlf => b"\r\n",
EndOfLine::Cr => b"\r",
}
}
#[inline]
pub fn quote_char(&self) -> char {
if self.single_quote {
'\''
} else {
'"'
}
}
#[inline]
pub fn quote_byte(&self) -> u8 {
if self.single_quote {
b'\''
} else {
b'"'
}
}
}