Skip to main content

lax_sql/configuration/
mod.rs

1use dprint_core::configuration::ConfigKeyMap;
2use dprint_core::configuration::ConfigurationDiagnostic;
3use dprint_core::configuration::GlobalConfiguration;
4use dprint_core::configuration::NewLineKind;
5use dprint_core::configuration::RECOMMENDED_GLOBAL_CONFIGURATION;
6use dprint_core::configuration::ResolveConfigurationResult;
7use dprint_core::configuration::get_unknown_property_diagnostics;
8use dprint_core::configuration::get_value;
9use serde::Deserialize;
10use serde::Serialize;
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(rename_all = "camelCase")]
14pub enum KeywordCase {
15  /// Keywords are kept exactly as the author wrote them. The default.
16  Preserve,
17  /// Known SQL keywords are uppercased.
18  Upper,
19  /// Known SQL keywords are lowercased.
20  Lower,
21}
22
23#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
24#[serde(rename_all = "camelCase")]
25pub enum ClauseStyle {
26  /// Each clause goes on its own line; within a clause, items pack until the
27  /// line width and then wrap. The default: compact and deterministic.
28  Fill,
29  /// Each clause keyword goes on its own line and the clause body is indented
30  /// below it, with one comma separated item per line. The classic SQL look.
31  Expanded,
32}
33
34#[derive(Debug, Clone, Serialize, Deserialize)]
35#[serde(rename_all = "camelCase")]
36pub struct Configuration {
37  pub line_width: u32,
38  pub use_tabs: bool,
39  pub indent_width: u8,
40  pub new_line_kind: NewLineKind,
41  pub keyword_case: KeywordCase,
42  pub clause_style: ClauseStyle,
43  pub ignore_node_comment_text: String,
44  pub ignore_file_comment_text: String,
45}
46
47pub fn resolve_config(
48  config: ConfigKeyMap,
49  global_config: &GlobalConfiguration,
50) -> ResolveConfigurationResult<Configuration> {
51  let mut config = config;
52  let mut diagnostics = Vec::new();
53  let keyword_case_text: String = get_value(&mut config, "keywordCase", "preserve".to_string(), &mut diagnostics);
54  let keyword_case = match keyword_case_text.as_str() {
55    "preserve" => KeywordCase::Preserve,
56    "upper" => KeywordCase::Upper,
57    "lower" => KeywordCase::Lower,
58    _ => {
59      diagnostics.push(ConfigurationDiagnostic {
60        property_name: "keywordCase".to_string(),
61        message: format!(
62          "expected \"preserve\", \"upper\", or \"lower\", but found \"{}\"",
63          keyword_case_text
64        ),
65      });
66      KeywordCase::Preserve
67    }
68  };
69  let clause_style_text: String = get_value(&mut config, "clauseStyle", "fill".to_string(), &mut diagnostics);
70  let clause_style = match clause_style_text.as_str() {
71    "fill" => ClauseStyle::Fill,
72    "expanded" => ClauseStyle::Expanded,
73    _ => {
74      diagnostics.push(ConfigurationDiagnostic {
75        property_name: "clauseStyle".to_string(),
76        message: format!("expected \"fill\" or \"expanded\", but found \"{}\"", clause_style_text),
77      });
78      ClauseStyle::Fill
79    }
80  };
81  let resolved_config = Configuration {
82    line_width: get_value(
83      &mut config,
84      "lineWidth",
85      global_config
86        .line_width
87        .unwrap_or(RECOMMENDED_GLOBAL_CONFIGURATION.line_width),
88      &mut diagnostics,
89    ),
90    use_tabs: get_value(
91      &mut config,
92      "useTabs",
93      global_config
94        .use_tabs
95        .unwrap_or(RECOMMENDED_GLOBAL_CONFIGURATION.use_tabs),
96      &mut diagnostics,
97    ),
98    indent_width: get_value(
99      &mut config,
100      "indentWidth",
101      global_config
102        .indent_width
103        .unwrap_or(RECOMMENDED_GLOBAL_CONFIGURATION.indent_width),
104      &mut diagnostics,
105    ),
106    new_line_kind: get_value(
107      &mut config,
108      "newLineKind",
109      global_config
110        .new_line_kind
111        .unwrap_or(RECOMMENDED_GLOBAL_CONFIGURATION.new_line_kind),
112      &mut diagnostics,
113    ),
114    keyword_case,
115    clause_style,
116    ignore_node_comment_text: get_value(
117      &mut config,
118      "ignoreNodeCommentText",
119      "dprint-ignore".to_string(),
120      &mut diagnostics,
121    ),
122    ignore_file_comment_text: get_value(
123      &mut config,
124      "ignoreFileCommentText",
125      "dprint-ignore-file".to_string(),
126      &mut diagnostics,
127    ),
128  };
129  diagnostics.extend(get_unknown_property_diagnostics(config));
130  ResolveConfigurationResult {
131    config: resolved_config,
132    diagnostics,
133  }
134}