use crate::{LanguageService, uri::InternUri};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Clone, Debug, Default, Serialize, Deserialize)]
#[serde(default)]
pub struct ServiceConfig {
pub format: wat_formatter::config::LanguageOptions,
pub lint: Lints,
#[serde(alias = "inlayHint")]
pub inlay_hint: InlayHintOptions,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(default)]
pub struct Lints {
pub unused: LintLevel,
pub unread: LintLevel,
pub shadow: LintLevel,
#[serde(alias = "implicitModule")]
pub implicit_module: LintLevel,
#[serde(alias = "multiModules")]
pub multi_modules: LintLevel,
pub unreachable: LintLevel,
pub deprecated: LintLevel,
#[serde(alias = "needlessMut")]
pub needless_mut: LintLevel,
#[serde(alias = "needlessTryTable")]
pub needless_try_table: LintLevel,
#[serde(alias = "uselessCatch")]
pub useless_catch: LintLevel,
}
impl Default for Lints {
fn default() -> Self {
Self {
unused: LintLevel::Warn,
unread: LintLevel::Warn,
shadow: LintLevel::Warn,
implicit_module: LintLevel::Allow,
multi_modules: LintLevel::Deny,
unreachable: LintLevel::Hint,
deprecated: LintLevel::Warn,
needless_mut: LintLevel::Warn,
needless_try_table: LintLevel::Warn,
useless_catch: LintLevel::Warn,
}
}
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub enum LintLevel {
#[serde(alias = "allow")]
Allow,
#[serde(alias = "hint")]
Hint,
#[serde(alias = "warn")]
Warn,
#[serde(alias = "deny")]
Deny,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(default)]
pub struct InlayHintOptions {
pub types: bool,
pub ending: bool,
pub index: bool,
}
impl Default for InlayHintOptions {
fn default() -> Self {
Self {
types: true,
ending: true,
index: true,
}
}
}
#[derive(Debug)]
pub(crate) enum ConfigState {
Inherit,
Override(ServiceConfig),
}
impl ConfigState {
pub fn unwrap_or_global<'a>(&'a self, service: &'a LanguageService) -> &'a ServiceConfig {
match self {
ConfigState::Inherit => &service.global_config,
ConfigState::Override(config) => config,
}
}
}
impl LanguageService {
#[inline]
pub fn set_config(&mut self, uri: impl AsRef<str>, config: Option<ServiceConfig>) {
self.configs.write().insert(
InternUri::new(self, uri.as_ref()),
config.map_or(ConfigState::Inherit, ConfigState::Override),
);
}
#[inline]
pub fn set_global_config(&mut self, config: ServiceConfig) {
self.global_config = Arc::new(config);
}
}