mod default_config;
mod vscode_config;
use serde_json::Value;
use vscode_config::get_client_config_vscode;
use crate::context::{ClientId, ServerContextSnapshot};
use default_config::get_client_config_default;
#[derive(Debug, Clone, Default, PartialEq)]
pub struct ClientConfig {
pub client_id: ClientId,
pub exclude: Vec<String>,
}
impl ClientConfig {
pub fn for_client(client_id: ClientId) -> Self {
ClientConfig {
client_id,
exclude: Vec::new(),
}
}
}
pub async fn get_client_config(
context: &ServerContextSnapshot,
client_id: ClientId,
supports_config_request: bool,
) -> ClientConfig {
let mut config = ClientConfig::for_client(client_id);
match (client_id, supports_config_request) {
(ClientId::VSCode, true) => {
get_client_config_vscode(context, &mut config).await;
}
(_, true) => {
get_client_config_default(context, &mut config, Some(&["cppls"])).await;
}
_ => {}
}
config
}
pub(crate) fn skip_nulls(value: &mut Value) {
if let Value::Object(object) = value {
object.retain(|_, value| !value.is_null());
for (_, value) in object {
skip_nulls(value);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn a_client_that_answers_nothing_gets_no_exclusions() {
let config = ClientConfig::for_client(ClientId::Other);
assert!(config.exclude.is_empty());
assert_eq!(config, ClientConfig::default());
}
#[test]
fn nulls_are_dropped_and_what_was_said_is_kept() {
let mut value = serde_json::json!({
"exclude": ["**/build/**"],
"encoding": null,
"nested": { "value": null, "other": true },
});
skip_nulls(&mut value);
assert_eq!(
value,
serde_json::json!({ "exclude": ["**/build/**"], "nested": { "other": true } })
);
}
}