1
0
mirror of https://github.com/golang/go synced 2024-11-19 02:34:44 -07:00
go/internal/lsp/cmd/cmd.go
Ian Cottrell a072e66104 internal/lsp: refactor the command line handling
This switched the golsp binary to support a sub-command model so it can grow
some guru like command line query capabilites

Change-Id: I1a7a49bb17701e62004bba636d6bee9de2481ffd
Reviewed-on: https://go-review.googlesource.com/c/154559
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
2018-12-17 23:08:30 +00:00

82 lines
2.5 KiB
Go

// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package cmd handles the golsp command line.
// It contains a handler for each of the modes, along with all the flag handling
// and the command line output format.
package cmd
import (
"context"
"flag"
"fmt"
"golang.org/x/tools/internal/tool"
)
// Application is the main application as passed to tool.Main
// It handles the main command line parsing and dispatch to the sub commands.
type Application struct {
// Embed the basic profiling flags supported by the tool package
tool.Profile
// we also include the server directly for now, so the flags work even without
// the verb. We should remove this when we stop allowing the server verb by
// default
Server server
}
// Name implements tool.Application returning the binary name.
func (app *Application) Name() string { return "golsp" }
// Usage implements tool.Application returning empty extra argument usage.
func (app *Application) Usage() string { return "<mode> [mode-flags] [mode-args]" }
// ShortHelp implements tool.Application returning the main binary help.
func (app *Application) ShortHelp() string {
return "The Go Language Smartness Provider."
}
// DetailedHelp implements tool.Application returning the main binary help.
// This includes the short help for all the sub commands.
func (app *Application) DetailedHelp(f *flag.FlagSet) {
fmt.Fprint(f.Output(), `
Available modes are:
`)
for _, c := range app.modes() {
fmt.Fprintf(f.Output(), " %s : %v\n", c.Name(), c.ShortHelp())
}
fmt.Fprint(f.Output(), `
golsp flags are:
`)
f.PrintDefaults()
}
// Run takes the args after top level flag processing, and invokes the correct
// sub command as specified by the first argument.
// If no arguments are passed it will invoke the server sub command, as a
// temporary measure for compatability.
func (app *Application) Run(ctx context.Context, args ...string) error {
if len(args) == 0 {
tool.Main(ctx, &app.Server, args)
return nil
}
mode, args := args[0], args[1:]
for _, m := range app.modes() {
if m.Name() == mode {
tool.Main(ctx, m, args)
return nil
}
}
return tool.CommandLineErrorf("Unknown mode %v", mode)
}
// modes returns the set of command modes supported by the golsp tool on the
// command line.
// The mode is specified by the first non flag argument.
func (app *Application) modes() []tool.Application {
return []tool.Application{
&app.Server,
}
}