mirror of https://github.com/helix-editor/helix
migrate language server config to new config system
parent
7ba8674466
commit
fb13130701
@ -0,0 +1,67 @@
|
||||
use std::collections::HashMap;
|
||||
|
||||
use anyhow::bail;
|
||||
use helix_config::{options, List, Map, String, Ty, Value};
|
||||
|
||||
use crate::lsp;
|
||||
|
||||
// TODO: differentiating between Some(null) and None is not really practical
|
||||
// since the distinction is lost on a roundtrip trough config::Value.
|
||||
// Porbably better to change our code to treat null the way we currently
|
||||
// treat None
|
||||
options! {
|
||||
struct LanguageServerConfig {
|
||||
/// The name or path of the language server binary to execute. Binaries must be in `$PATH`
|
||||
command: Option<String> = None,
|
||||
/// A list of arguments to pass to the language server binary
|
||||
#[read = deref]
|
||||
args: List<String> = List::default(),
|
||||
/// Any environment variables that will be used when starting the language server
|
||||
enviorment: Map<String> = Map::default(),
|
||||
/// LSP initialization options
|
||||
#[name = "config"]
|
||||
server_config: Option<Box<serde_json::Value>> = None,
|
||||
/// LSP initialization options
|
||||
#[read = copy]
|
||||
timeout: u64 = 20,
|
||||
// TODO: merge
|
||||
/// LSP formatting options
|
||||
#[name = "config.format"]
|
||||
#[read = fold(HashMap::new(), fold_format_config, FormatConfig)]
|
||||
format: Map<FormattingProperty> = Map::default()
|
||||
}
|
||||
}
|
||||
|
||||
type FormatConfig = HashMap<std::string::String, lsp::FormattingProperty>;
|
||||
|
||||
fn fold_format_config(config: &Map<FormattingProperty>, mut res: FormatConfig) -> FormatConfig {
|
||||
for (k, v) in config.iter() {
|
||||
res.entry(k.to_string()).or_insert_with(|| v.0.clone());
|
||||
}
|
||||
res
|
||||
}
|
||||
|
||||
// damm orphan rules :/
|
||||
#[derive(Debug, PartialEq, Clone)]
|
||||
struct FormattingProperty(lsp::FormattingProperty);
|
||||
|
||||
impl Ty for FormattingProperty {
|
||||
fn from_value(val: Value) -> anyhow::Result<Self> {
|
||||
match val {
|
||||
Value::Int(_) => Ok(FormattingProperty(lsp::FormattingProperty::Number(
|
||||
i32::from_value(val)?,
|
||||
))),
|
||||
Value::Bool(val) => Ok(FormattingProperty(lsp::FormattingProperty::Bool(val))),
|
||||
Value::String(val) => Ok(FormattingProperty(lsp::FormattingProperty::String(val))),
|
||||
_ => bail!("expected a string, boolean or integer"),
|
||||
}
|
||||
}
|
||||
|
||||
fn to_value(&self) -> Value {
|
||||
match self.0 {
|
||||
lsp::FormattingProperty::Bool(val) => Value::Bool(val),
|
||||
lsp::FormattingProperty::Number(val) => Value::Int(val as _),
|
||||
lsp::FormattingProperty::String(ref val) => Value::String(val.clone()),
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue