Language Server Protocol implementation in Go.
The package does not include JSON RPC handling as that is better left to other packages.
Example code using github.com/sourcegraph/jsonrpc2
import (
"fmt"
"io"
"context"
"encoding/json"
"github.com/sourcegraph/jsonrpc2"
)
func handler(ctx context.Context, conn *jsonrpc2.Conn, req *jsonrpc2.Request) (any, error) {
switch req.Method {
case protocol.MethodInitialize:
var params protocol.InitializeParams
if err := json.Unmarshal(*req.Params, ¶ms); err != nil {
return nil, err
}
// handle initialize
case protocol.MethodTextDocumentDidChange:
var params protocol.DidChangeTextDocumentParams
if err := json.Unmarshal(*req.Params, ¶ms); err != nil {
return nil, err
}
// handle did change
default:
// Respond with a method not found error
return nil, &jsonrpc2.Error{
Code: jsonrpc2.CodeMethodNotFound,
Message: fmt.Sprintf("Method %s not found", req.Method),
}
}
return nil, nil
}
func (s Server) Run(ctx context.Context, conn io.ReadWriteCloser) error {
stream := jsonrpc2.NewBufferedStream(conn, jsonrpc2.VSCodeObjectCodec{})
rpc := jsonrpc2.NewConn(ctx, stream, jsonrpc2.HandlerWithError(s.dispatch))
select {
case <-ctx.Done():
return fmt.Errorf("context closed")
case <-rpc.DisconnectNotify():
return nil
}
}Henrik Hautakoski [email protected]