dprint_plugin_css/configuration/
builder.rs1use dprint_core::configuration::{
2 resolve_global_config, ConfigKeyMap, ConfigKeyValue, GlobalConfiguration, NewLineKind,
3};
4use std::collections::HashMap;
5
6use super::*;
7
8#[derive(Default)]
19pub struct ConfigurationBuilder {
20 pub(super) config: ConfigKeyMap,
21 global_config: Option<GlobalConfiguration>,
22}
23
24impl ConfigurationBuilder {
25 pub fn new() -> ConfigurationBuilder {
27 ConfigurationBuilder {
28 config: HashMap::new(),
29 global_config: None,
30 }
31 }
32
33 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 pub fn global_config(&mut self, global_config: GlobalConfiguration) -> &mut Self {
45 self.global_config = Some(global_config);
46 self
47 }
48
49 pub fn use_tabs(&mut self, value: bool) -> &mut Self {
53 self.insert("useTabs", value.into())
54 }
55
56 pub fn indent_width(&mut self, value: u8) -> &mut Self {
60 self.insert("indentWidth", (value as i32).into())
61 }
62
63 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}