github.com/powerman/golang-tools@v0.1.11-0.20220410185822-5ad214d8d803/internal/lsp/lsprpc/commandinterceptor.go (about) 1 // Copyright 2021 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package lsprpc 6 7 import ( 8 "context" 9 "encoding/json" 10 11 jsonrpc2_v2 "github.com/powerman/golang-tools/internal/jsonrpc2_v2" 12 "github.com/powerman/golang-tools/internal/lsp/protocol" 13 ) 14 15 // HandlerMiddleware is a middleware that only modifies the jsonrpc2 handler. 16 type HandlerMiddleware func(jsonrpc2_v2.Handler) jsonrpc2_v2.Handler 17 18 // BindHandler transforms a HandlerMiddleware into a Middleware. 19 func BindHandler(hmw HandlerMiddleware) Middleware { 20 return Middleware(func(binder jsonrpc2_v2.Binder) jsonrpc2_v2.Binder { 21 return BinderFunc(func(ctx context.Context, conn *jsonrpc2_v2.Connection) (jsonrpc2_v2.ConnectionOptions, error) { 22 opts, err := binder.Bind(ctx, conn) 23 if err != nil { 24 return opts, err 25 } 26 opts.Handler = hmw(opts.Handler) 27 return opts, nil 28 }) 29 }) 30 } 31 32 func CommandInterceptor(command string, run func(*protocol.ExecuteCommandParams) (interface{}, error)) Middleware { 33 return BindHandler(func(delegate jsonrpc2_v2.Handler) jsonrpc2_v2.Handler { 34 return jsonrpc2_v2.HandlerFunc(func(ctx context.Context, req *jsonrpc2_v2.Request) (interface{}, error) { 35 if req.Method == "workspace/executeCommand" { 36 var params protocol.ExecuteCommandParams 37 if err := json.Unmarshal(req.Params, ¶ms); err == nil { 38 if params.Command == command { 39 return run(¶ms) 40 } 41 } 42 } 43 44 return delegate.Handle(ctx, req) 45 }) 46 }) 47 }