Skip to main content

shuck_server/session/
options.rs

1use lsp_types::Url;
2use rustc_hash::FxHashMap;
3use serde::Deserialize;
4
5use crate::session::settings::GlobalClientSettings;
6use crate::{Client, logging};
7
8pub(crate) type WorkspaceOptionsMap = FxHashMap<Url, ClientOptions>;
9
10#[derive(Debug, Deserialize, Default)]
11#[serde(rename_all = "camelCase")]
12pub struct GlobalOptions {
13    #[serde(default)]
14    client: ClientOptions,
15    #[serde(default)]
16    pub(crate) tracing: TracingOptions,
17}
18
19impl GlobalOptions {
20    pub fn into_settings(self, client: Client) -> GlobalClientSettings {
21        GlobalClientSettings::new(self.client, client)
22    }
23}
24
25#[derive(Clone, Debug, Default, Deserialize)]
26#[serde(rename_all = "camelCase")]
27pub struct ClientOptions {}
28
29#[derive(Debug, Deserialize, Default)]
30#[serde(rename_all = "camelCase")]
31pub(crate) struct TracingOptions {
32    pub(crate) log_level: Option<logging::LogLevel>,
33}
34
35#[derive(Debug, Default)]
36pub(crate) struct AllOptions {
37    pub(crate) global: GlobalOptions,
38    pub(crate) workspace: Option<WorkspaceOptionsMap>,
39}
40
41impl AllOptions {
42    pub(crate) fn from_value(value: serde_json::Value, _client: &Client) -> Self {
43        let global = serde_json::from_value::<GlobalOptions>(value).unwrap_or_default();
44        Self {
45            global,
46            workspace: Some(WorkspaceOptionsMap::default()),
47        }
48    }
49}