use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct FormatOptions {
#[serde(flatten)]
pub layout: LayoutOptions,
#[serde(flatten)]
pub language: LanguageOptions,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(default)]
pub struct LayoutOptions {
#[serde(alias = "printWidth")]
pub print_width: usize,
#[serde(alias = "indentWidth")]
pub indent_width: usize,
#[serde(alias = "lineBreak", alias = "linebreak")]
pub line_break: LineBreak,
#[serde(alias = "useTabs")]
pub use_tabs: bool,
}
impl Default for LayoutOptions {
fn default() -> Self {
Self {
print_width: 80,
indent_width: 2,
line_break: LineBreak::Lf,
use_tabs: false,
}
}
}
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum LineBreak {
#[default]
Lf,
Crlf,
}
impl From<LineBreak> for tiny_pretty::LineBreak {
fn from(value: LineBreak) -> Self {
match value {
LineBreak::Lf => tiny_pretty::LineBreak::Lf,
LineBreak::Crlf => tiny_pretty::LineBreak::Crlf,
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(default)]
pub struct LanguageOptions {
#[serde(alias = "splitClosingParens")]
pub split_closing_parens: bool,
#[serde(alias = "wrapBeforeLocals")]
pub wrap_before_locals: WrapBefore,
#[serde(alias = "wrapBeforeFields")]
pub wrap_before_fields: WrapBefore,
#[serde(alias = "wrapBeforeConstExpr")]
pub wrap_before_const_expr: WrapBefore,
#[serde(alias = "multiLineLocals")]
pub multi_line_locals: MultiLine,
#[serde(alias = "multiLineFields")]
pub multi_line_fields: MultiLine,
#[serde(alias = "formatComments")]
pub format_comments: bool,
#[serde(alias = "ignoreCommentDirective")]
pub ignore_comment_directive: String,
}
impl Default for LanguageOptions {
fn default() -> Self {
Self {
split_closing_parens: false,
wrap_before_locals: WrapBefore::Always,
wrap_before_fields: WrapBefore::MultiOnly,
wrap_before_const_expr: WrapBefore::Always,
multi_line_locals: MultiLine::Smart,
multi_line_fields: MultiLine::Smart,
format_comments: false,
ignore_comment_directive: "fmt-ignore".to_string(),
}
}
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum WrapBefore {
Never,
Overflow,
#[serde(alias = "multiOnly")]
MultiOnly,
Always,
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
#[serde(rename_all = "kebab-case")]
pub enum MultiLine {
Never,
Overflow,
Smart,
Wrap,
Always,
}