mirror of
https://github.com/laravel-ls/protocol.git
synced 2026-06-16 03:54:56 +02:00
63 lines
1.5 KiB
Markdown
63 lines
1.5 KiB
Markdown
# Language Server Protocol for golang
|
|
|
|
Language Server Protocol implementation in Go.
|
|
|
|
## Design notes
|
|
|
|
The package does not include JSON RPC handling as that is better left to other packages.
|
|
|
|
## Example
|
|
|
|
Example code using [github.com/sourcegraph/jsonrpc2](https://github.com/sourcegraph/jsonrpc2)
|
|
|
|
```go
|
|
|
|
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
|
|
}
|
|
}
|
|
```
|
|
|
|
# Author
|
|
|
|
Henrik Hautakoski <henrik@shufflingpixels.com>
|