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, &params); err == nil {
    38  					if params.Command == command {
    39  						return run(&params)
    40  					}
    41  				}
    42  			}
    43  
    44  			return delegate.Handle(ctx, req)
    45  		})
    46  	})
    47  }