mirror of
https://github.com/golang/go
synced 2024-11-19 01:54:39 -07:00
a072e66104
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>
82 lines
2.5 KiB
Go
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,
|
|
}
|
|
}
|