blob: c9e494e58369786659365ad8802ea891f0533bed [file] [log] [blame]
// Copyright 2018 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// AK (Android Kit) is a command line tool that combines useful commands.
package main
import (
"flag"
"fmt"
"log"
"os"
"sort"
_ "src/common/golang/flagfile"
"src/tools/ak/akcommands"
"src/tools/ak/types"
)
const helpHeader = "AK Android Kit is a command line tool that combines useful commands.\n\nUsage: ak %s <options>\n\n"
var (
cmds = akcommands.Cmds
)
func helpDesc() string {
return "Prints help for commands, or the index."
}
func main() {
cmds["help"] = types.Command{
Init: func() {},
Run: printHelp,
Desc: helpDesc,
}
switch len(os.Args) {
case 1:
printHelp()
case 3:
if os.Args[1] == "help" {
cmdHelp(os.Args[2])
os.Exit(0)
}
fallthrough
default:
cmd := os.Args[1]
if _, present := cmds[cmd]; present {
runCmd(cmd)
} else {
log.Fatalf("Command %q not found. Try 'ak help'.", cmd)
}
}
}
func runCmd(cmd string) {
cmds[cmd].Init()
flag.CommandLine.Parse(os.Args[2:])
cmds[cmd].Run()
}
func printHelp() {
fmt.Printf(helpHeader, "<command>")
printCmds()
fmt.Println("\nGetting more help:")
fmt.Println(" ak help <command>")
fmt.Println(" Prints help and options for <command>.")
}
func printCmds() {
fmt.Println("Available commands:")
var keys []string
for k := range cmds {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Printf(" %-10s %v\n", k, cmds[k].Desc())
}
}
func cmdHelp(cmd string) {
if _, present := cmds[cmd]; present {
cmds[cmd].Init()
fmt.Printf(helpHeader, cmd)
fmt.Println(cmds[cmd].Desc())
if cmds[cmd].Flags != nil {
fmt.Println("\nOptions:")
for _, f := range cmds[cmd].Flags {
fmt.Println(flagDesc(f))
}
}
} else {
fmt.Printf("Command %q not found.\n\n", cmd)
printCmds()
}
}
func flagDesc(name string) string {
flag := flag.Lookup(name)
if flag == nil {
return fmt.Sprintf("Flag %q not found!", name)
}
flagType := fmt.Sprintf("%T", flag.Value)
flagType = flagType[6 : len(flagType)-5]
return fmt.Sprintf(" -%-16s %s (a %s; default: \"%s\")", flag.Name, flag.Usage, flagType, flag.DefValue)
}