xref: /aosp_15_r20/external/bazelbuild-rules_android/src/tools/ak/ak.go (revision 9e965d6fece27a77de5377433c2f7e6999b8cc0b)
1*9e965d6fSRomain Jobredeaux// Copyright 2018 The Bazel Authors. All rights reserved.
2*9e965d6fSRomain Jobredeaux//
3*9e965d6fSRomain Jobredeaux// Licensed under the Apache License, Version 2.0 (the "License");
4*9e965d6fSRomain Jobredeaux// you may not use this file except in compliance with the License.
5*9e965d6fSRomain Jobredeaux// You may obtain a copy of the License at
6*9e965d6fSRomain Jobredeaux//
7*9e965d6fSRomain Jobredeaux//    http://www.apache.org/licenses/LICENSE-2.0
8*9e965d6fSRomain Jobredeaux//
9*9e965d6fSRomain Jobredeaux// Unless required by applicable law or agreed to in writing, software
10*9e965d6fSRomain Jobredeaux// distributed under the License is distributed on an "AS IS" BASIS,
11*9e965d6fSRomain Jobredeaux// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9e965d6fSRomain Jobredeaux// See the License for the specific language governing permissions and
13*9e965d6fSRomain Jobredeaux// limitations under the License.
14*9e965d6fSRomain Jobredeaux
15*9e965d6fSRomain Jobredeaux// AK (Android Kit) is a command line tool that combines useful commands.
16*9e965d6fSRomain Jobredeauxpackage main
17*9e965d6fSRomain Jobredeaux
18*9e965d6fSRomain Jobredeauximport (
19*9e965d6fSRomain Jobredeaux	"flag"
20*9e965d6fSRomain Jobredeaux	"fmt"
21*9e965d6fSRomain Jobredeaux	"log"
22*9e965d6fSRomain Jobredeaux	"os"
23*9e965d6fSRomain Jobredeaux	"sort"
24*9e965d6fSRomain Jobredeaux
25*9e965d6fSRomain Jobredeaux	_ "src/common/golang/flagfile"
26*9e965d6fSRomain Jobredeaux	"src/tools/ak/akcommands"
27*9e965d6fSRomain Jobredeaux	"src/tools/ak/types"
28*9e965d6fSRomain Jobredeaux)
29*9e965d6fSRomain Jobredeaux
30*9e965d6fSRomain Jobredeauxconst helpHeader = "AK Android Kit is a command line tool that combines useful commands.\n\nUsage: ak %s <options>\n\n"
31*9e965d6fSRomain Jobredeaux
32*9e965d6fSRomain Jobredeauxvar (
33*9e965d6fSRomain Jobredeaux	cmds = akcommands.Cmds
34*9e965d6fSRomain Jobredeaux)
35*9e965d6fSRomain Jobredeaux
36*9e965d6fSRomain Jobredeauxfunc helpDesc() string {
37*9e965d6fSRomain Jobredeaux	return "Prints help for commands, or the index."
38*9e965d6fSRomain Jobredeaux}
39*9e965d6fSRomain Jobredeaux
40*9e965d6fSRomain Jobredeauxfunc main() {
41*9e965d6fSRomain Jobredeaux	cmds["help"] = types.Command{
42*9e965d6fSRomain Jobredeaux		Init: func() {},
43*9e965d6fSRomain Jobredeaux		Run:  printHelp,
44*9e965d6fSRomain Jobredeaux		Desc: helpDesc,
45*9e965d6fSRomain Jobredeaux	}
46*9e965d6fSRomain Jobredeaux
47*9e965d6fSRomain Jobredeaux	switch len(os.Args) {
48*9e965d6fSRomain Jobredeaux	case 1:
49*9e965d6fSRomain Jobredeaux		printHelp()
50*9e965d6fSRomain Jobredeaux	case 3:
51*9e965d6fSRomain Jobredeaux		if os.Args[1] == "help" {
52*9e965d6fSRomain Jobredeaux			cmdHelp(os.Args[2])
53*9e965d6fSRomain Jobredeaux			os.Exit(0)
54*9e965d6fSRomain Jobredeaux		}
55*9e965d6fSRomain Jobredeaux		fallthrough
56*9e965d6fSRomain Jobredeaux	default:
57*9e965d6fSRomain Jobredeaux		cmd := os.Args[1]
58*9e965d6fSRomain Jobredeaux		if _, present := cmds[cmd]; present {
59*9e965d6fSRomain Jobredeaux			runCmd(cmd)
60*9e965d6fSRomain Jobredeaux		} else {
61*9e965d6fSRomain Jobredeaux			log.Fatalf("Command %q not found. Try 'ak help'.", cmd)
62*9e965d6fSRomain Jobredeaux		}
63*9e965d6fSRomain Jobredeaux	}
64*9e965d6fSRomain Jobredeaux}
65*9e965d6fSRomain Jobredeaux
66*9e965d6fSRomain Jobredeauxfunc runCmd(cmd string) {
67*9e965d6fSRomain Jobredeaux	cmds[cmd].Init()
68*9e965d6fSRomain Jobredeaux	flag.CommandLine.Parse(os.Args[2:])
69*9e965d6fSRomain Jobredeaux	cmds[cmd].Run()
70*9e965d6fSRomain Jobredeaux}
71*9e965d6fSRomain Jobredeaux
72*9e965d6fSRomain Jobredeauxfunc printHelp() {
73*9e965d6fSRomain Jobredeaux	fmt.Printf(helpHeader, "<command>")
74*9e965d6fSRomain Jobredeaux	printCmds()
75*9e965d6fSRomain Jobredeaux	fmt.Println("\nGetting more help:")
76*9e965d6fSRomain Jobredeaux	fmt.Println("  ak help <command>")
77*9e965d6fSRomain Jobredeaux	fmt.Println("             Prints help and options for <command>.")
78*9e965d6fSRomain Jobredeaux}
79*9e965d6fSRomain Jobredeaux
80*9e965d6fSRomain Jobredeauxfunc printCmds() {
81*9e965d6fSRomain Jobredeaux	fmt.Println("Available commands:")
82*9e965d6fSRomain Jobredeaux	var keys []string
83*9e965d6fSRomain Jobredeaux	for k := range cmds {
84*9e965d6fSRomain Jobredeaux		keys = append(keys, k)
85*9e965d6fSRomain Jobredeaux	}
86*9e965d6fSRomain Jobredeaux	sort.Strings(keys)
87*9e965d6fSRomain Jobredeaux	for _, k := range keys {
88*9e965d6fSRomain Jobredeaux		fmt.Printf("  %-10s %v\n", k, cmds[k].Desc())
89*9e965d6fSRomain Jobredeaux	}
90*9e965d6fSRomain Jobredeaux}
91*9e965d6fSRomain Jobredeaux
92*9e965d6fSRomain Jobredeauxfunc cmdHelp(cmd string) {
93*9e965d6fSRomain Jobredeaux	if _, present := cmds[cmd]; present {
94*9e965d6fSRomain Jobredeaux		cmds[cmd].Init()
95*9e965d6fSRomain Jobredeaux		fmt.Printf(helpHeader, cmd)
96*9e965d6fSRomain Jobredeaux		fmt.Println(cmds[cmd].Desc())
97*9e965d6fSRomain Jobredeaux		if cmds[cmd].Flags != nil {
98*9e965d6fSRomain Jobredeaux			fmt.Println("\nOptions:")
99*9e965d6fSRomain Jobredeaux			for _, f := range cmds[cmd].Flags {
100*9e965d6fSRomain Jobredeaux				fmt.Println(flagDesc(f))
101*9e965d6fSRomain Jobredeaux			}
102*9e965d6fSRomain Jobredeaux		}
103*9e965d6fSRomain Jobredeaux	} else {
104*9e965d6fSRomain Jobredeaux		fmt.Printf("Command %q not found.\n\n", cmd)
105*9e965d6fSRomain Jobredeaux		printCmds()
106*9e965d6fSRomain Jobredeaux	}
107*9e965d6fSRomain Jobredeaux}
108*9e965d6fSRomain Jobredeaux
109*9e965d6fSRomain Jobredeauxfunc flagDesc(name string) string {
110*9e965d6fSRomain Jobredeaux	flag := flag.Lookup(name)
111*9e965d6fSRomain Jobredeaux	if flag == nil {
112*9e965d6fSRomain Jobredeaux		return fmt.Sprintf("Flag %q not found!", name)
113*9e965d6fSRomain Jobredeaux	}
114*9e965d6fSRomain Jobredeaux	flagType := fmt.Sprintf("%T", flag.Value)
115*9e965d6fSRomain Jobredeaux	flagType = flagType[6 : len(flagType)-5]
116*9e965d6fSRomain Jobredeaux	return fmt.Sprintf("  -%-16s %s (a %s; default: \"%s\")", flag.Name, flag.Usage, flagType, flag.DefValue)
117*9e965d6fSRomain Jobredeaux}
118