dprint_plugin_css/configuration/
builder.rs

1use dprint_core::configuration::{
2    resolve_global_config, ConfigKeyMap, ConfigKeyValue, GlobalConfiguration, NewLineKind,
3};
4use std::collections::HashMap;
5
6use super::*;
7
8/// Formatting configuration builder.
9///
10/// # Example
11///
12/// ```
13/// use dprint_plugin_css::configuration::*;
14///
15/// let config = ConfigurationBuilder::new()
16///     .build();
17/// ```
18#[derive(Default)]
19pub struct ConfigurationBuilder {
20    pub(super) config: ConfigKeyMap,
21    global_config: Option<GlobalConfiguration>,
22}
23
24impl ConfigurationBuilder {
25    /// Constructs a new configuration builder.
26    pub fn new() -> ConfigurationBuilder {
27        ConfigurationBuilder {
28            config: HashMap::new(),
29            global_config: None,
30        }
31    }
32
33    /// Gets the final configuration that can be used to format a file.
34    pub fn build(&self) -> Configuration {
35        if let Some(global_config) = &self.global_config {
36            resolve_config(self.config.clone(), global_config).config
37        } else {
38            let global_config = resolve_global_config(HashMap::new(), &Default::default()).config;
39            resolve_config(self.config.clone(), &global_config).config
40        }
41    }
42
43    /// Set the global configuration.
44    pub fn global_config(&mut self, global_config: GlobalConfiguration) -> &mut Self {
45        self.global_config = Some(global_config);
46        self
47    }
48
49    /// Whether to use tabs (true) or spaces (false).
50    ///
51    /// Default: `false`
52    pub fn use_tabs(&mut self, value: bool) -> &mut Self {
53        self.insert("useTabs", value.into())
54    }
55
56    /// The number of columns for an indent.
57    ///
58    /// Default: `4`
59    pub fn indent_width(&mut self, value: u8) -> &mut Self {
60        self.insert("indentWidth", (value as i32).into())
61    }
62
63    /// The kind of newline to use.
64    /// Default: `NewLineKind::LineFeed`
65    pub fn new_line_kind(&mut self, value: NewLineKind) -> &mut Self {
66        self.insert("newLineKind", value.to_string().into())
67    }
68
69    #[cfg(test)]
70    pub(super) fn get_inner_config(&self) -> ConfigKeyMap {
71        self.config.clone()
72    }
73
74    fn insert(&mut self, name: &str, value: ConfigKeyValue) -> &mut Self {
75        self.config.insert(String::from(name), value);
76        self
77    }
78}
79
80#[cfg(test)]
81mod tests {
82    use dprint_core::configuration::{resolve_global_config, NewLineKind};
83    use std::collections::HashMap;
84
85    use super::*;
86
87    #[test]
88    fn check_all_values_set() {
89        let mut config = ConfigurationBuilder::default();
90        config
91            .new_line_kind(NewLineKind::CarriageReturnLineFeed)
92            .use_tabs(true)
93            .indent_width(2);
94
95        let inner_config = config.get_inner_config();
96        assert_eq!(inner_config.len(), 3);
97        let diagnostics = resolve_config(
98            inner_config,
99            &resolve_global_config(HashMap::new(), &Default::default()).config,
100        )
101        .diagnostics;
102        assert_eq!(diagnostics.len(), 0);
103    }
104
105    #[test]
106    fn handle_global_config() {
107        let mut global_config = HashMap::new();
108        global_config.insert(String::from("newLineKind"), "crlf".into());
109        global_config.insert(String::from("useTabs"), true.into());
110        let global_config = resolve_global_config(global_config, &Default::default()).config;
111        let mut config_builder = ConfigurationBuilder::new();
112        let config = config_builder.global_config(global_config).build();
113        assert!(config.new_line_kind == NewLineKind::CarriageReturnLineFeed);
114        assert!(config.use_tabs);
115    }
116
117    #[test]
118    fn use_defaults_when_global_not_set() {
119        let global_config = resolve_global_config(HashMap::new(), &Default::default()).config;
120        let mut config_builder = ConfigurationBuilder::new();
121        let config = config_builder.global_config(global_config).build();
122        assert!(config.new_line_kind == NewLineKind::LineFeed);
123        assert_eq!(config.indent_width, 4);
124    }
125}