use lsp_types::Url;
use rustc_hash::FxHashMap;
use serde::Deserialize;
use crate::session::settings::GlobalClientSettings;
use crate::{Client, logging};
pub(crate) type WorkspaceOptionsMap = FxHashMap<Url, ClientOptions>;
#[derive(Debug, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct GlobalOptions {
#[serde(default)]
client: ClientOptions,
#[serde(default)]
pub(crate) tracing: TracingOptions,
}
impl GlobalOptions {
pub fn into_settings(self, client: Client) -> GlobalClientSettings {
GlobalClientSettings::new(self.client, client)
}
}
#[derive(Clone, Debug, Default, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ClientOptions {}
#[derive(Debug, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub(crate) struct TracingOptions {
pub(crate) log_level: Option<logging::LogLevel>,
}
#[derive(Debug, Default)]
pub(crate) struct AllOptions {
pub(crate) global: GlobalOptions,
pub(crate) workspace: Option<WorkspaceOptionsMap>,
}
impl AllOptions {
pub(crate) fn from_value(value: serde_json::Value, _client: &Client) -> Self {
let global = serde_json::from_value::<GlobalOptions>(value).unwrap_or_default();
Self {
global,
workspace: Some(WorkspaceOptionsMap::default()),
}
}
}