hx-lsp 0.2.11

One LSP server support snippets and actions for helix editor.
Documentation
use std::collections::HashMap;

use async_lsp::lsp_types::{
    CodeAction, CodeActionKind, CodeActionOrCommand, CodeActionParams, TextEdit, WorkspaceEdit,
};
use convert_case::{Case, Casing};
use ropey::RopeSlice;

pub(super) fn case_actions(
    range_content: RopeSlice,
    params: &CodeActionParams,
) -> Vec<CodeActionOrCommand> {
    if params.range.start.line != params.range.end.line {
        return Vec::new();
    }

    let range_content = range_content.to_string();

    if range_content.len() == 1 || !range_content.is_ascii() {
        return Vec::new();
    }

    let items = [
        ("case_snake", Case::Snake),
        ("CasePascal", Case::Pascal),
        ("caseCamel", Case::Camel),
    ];

    items
        .iter()
        .filter_map(|&(item, case)| {
            let out = range_content.to_case(case);
            if out.eq(&range_content) {
                return None;
            }

            let mut changes = HashMap::new();
            let edits = vec![TextEdit {
                range: params.range,
                new_text: out,
            }];
            changes.insert(params.text_document.uri.clone(), edits);

            Some(
                CodeAction {
                    title: item.to_string(),
                    kind: Some(CodeActionKind::REFACTOR_INLINE),
                    edit: Some(WorkspaceEdit::new(changes)),
                    is_preferred: Some(true),
                    ..Default::default()
                }
                .into(),
            )
        })
        .collect()
}