grug-ls 0.1.2

A Language Server for the grug language
Documentation
use grug_ls::server::Server;

use log::error;
use log::info;
use lsp_server::{Connection, ErrorCode, Response};
use lsp_types::{CompletionOptions, InitializeResult, ServerInfo};
use lsp_types::HoverProviderCapability;
use lsp_types::InitializeParams;
use lsp_types::ServerCapabilities;
use lsp_types::TextDocumentSyncCapability;
use lsp_types::TextDocumentSyncKind;
use structured_logger::json::new_writer;
use structured_logger::Builder;

fn main() {
    let args: Vec<String> = std::env::args().collect();
    if args.contains(&"--version".to_string()) {
        println!("1.0.0");
        return;
    }

    let log_file_path = std::env::temp_dir().join("grug-ls-logs.json");

    let file_writer = std::fs::File::options()
        .create(true)
        .append(true)
        .open(log_file_path)
        .unwrap();

    file_writer.set_len(0).unwrap();

    Builder::with_level("INFO")
        .with_target_writer("*", new_writer(file_writer))
        .init();

    let (mut connection, io_threads) = Connection::stdio();

    let server_capabilities = ServerCapabilities {
        text_document_sync: Some(TextDocumentSyncCapability::Kind(TextDocumentSyncKind::FULL)),
        hover_provider: Some(HoverProviderCapability::Simple(true)),
        completion_provider: Some(CompletionOptions::default()),

        ..Default::default()
    };
    
    let (mut server, id) = match connection.initialize_start() {
        Ok((req_id, value)) => {
            let params: InitializeParams = serde_json::from_value(value).unwrap();

            let server = Server::from_request(params);
            match server {
                Ok(server) => (server, req_id),
                Err(err) => {
                    let err = serde_json::to_string(&err).unwrap();
                    error!("{:?}", err);

                    let res = Response::new_err(req_id.clone(), ErrorCode::InvalidRequest as i32, err);
                    let res = serde_json::to_value(res).unwrap();
                    connection.initialize_finish(req_id, res).unwrap();

                    panic!();
                }
            }
        }
        Err(err) => {
            error!("Init Start err: {}", err);
            panic!()
        }
    };

    let init_data = InitializeResult {
        capabilities: server_capabilities,
        server_info: Some(ServerInfo {
            name: "Grug-LS".to_string(),
            version: Some("1.0.0".to_string()),
        }),
        ..Default::default()
    };
    let init_data = serde_json::to_value(init_data).unwrap();

    connection.initialize_finish(id, init_data).unwrap();

    let mut parser = tree_sitter::Parser::new();
    parser
        .set_language(&tree_sitter_grug::LANGUAGE.into())
        .unwrap();

    info!("LSP START");
    info!("Got these arguments: {:?}", args);

    loop {
        let message: lsp_server::Message = connection.receiver.recv().unwrap();

        server.handle_message(message, &mut connection, &mut parser);

        if server.should_exit {
            break;
        }
    }
    io_threads.join().unwrap();

}