parol-ls 4.4.0

Language server for parol parser generator
use std::collections::HashMap;

use lsp_types::{DynamicRegistrationClientCapabilities, InitializeParams};
use serde::Deserialize;
use serde_json::Value;

use crate::arguments::Arguments;

#[derive(Debug, Default, Deserialize)]
pub(crate) struct ConfigProperties(pub(crate) HashMap<String, Value>);

#[derive(Debug)]
pub(crate) struct Config {
    initialization_params: InitializeParams,
    args: Arguments,
    config_properties: ConfigProperties,
}

impl Config {
    pub(crate) fn new(initialization_params: InitializeParams, args: Arguments) -> Config {
        let config_properties: ConfigProperties = serde_json::from_value(
            initialization_params
                .initialization_options
                .clone()
                .unwrap_or_default(),
        )
        .unwrap_or_default();
        Self {
            initialization_params,
            args,
            config_properties,
        }
    }

    pub(crate) fn lookahead(&self) -> usize {
        self.args.lookahead
    }

    pub(crate) fn initialization_params(&self) -> &InitializeParams {
        &self.initialization_params
    }

    pub(crate) fn initialization_options(&self) -> Option<&Value> {
        self.initialization_params.initialization_options.as_ref()
    }

    pub(crate) fn config_properties(&self) -> &ConfigProperties {
        &self.config_properties
    }

    pub(crate) fn supports_dynamic_registration_for_change_config(&self) -> bool {
        if let Some(workspace) = self.initialization_params.capabilities.workspace.as_ref() {
            matches!(
                workspace.did_change_configuration,
                Some(DynamicRegistrationClientCapabilities {
                    dynamic_registration: Some(true)
                })
            )
        } else {
            false
        }
    }
}