diff --git a/cmd/kubectx/flags.go b/cmd/kubectx/flags.go new file mode 100644 index 0000000..4511a16 --- /dev/null +++ b/cmd/kubectx/flags.go @@ -0,0 +1,46 @@ +package main + +import "strings" + +type Op interface{} + +// HelpOp describes printing help. +type HelpOp struct{} + +// ListOp describes listing contexts. +type ListOp struct{} + +// SwitchOp indicates intention to switch contexts. +type SwitchOp struct { + Target string // '-' for back and forth, or NAME +} + +// UnknownOp indicates an unsupported flag. +type UnknownOp struct{ Args []string } + +// parseArgs looks at flags (excl. executable name, i.e. argv[0]) +// and decides which operation should be taken. +func parseArgs(argv []string) Op { + if len(argv) == 0 { + return ListOp{} + } + + if len(argv) == 1 { + v := argv[0] + if v == "--help" || v == "-h" { + return HelpOp{} + } + + if strings.HasPrefix(v, "-") && v != "-" { + return UnknownOp{argv} + } + + // TODO handle -d + // TODO handle -u/--unset + // TODO handle -c/--current + return SwitchOp{Target: argv[0]} + } + + // TODO handle too many arguments e.g. "kubectx a b c" + return UnknownOp{} +} diff --git a/cmd/kubectx/flags_test.go b/cmd/kubectx/flags_test.go new file mode 100644 index 0000000..45a05b4 --- /dev/null +++ b/cmd/kubectx/flags_test.go @@ -0,0 +1,52 @@ +package main + +import ( + "testing" + + "github.com/google/go-cmp/cmp" +) + +func Test_parseArgs_new(t *testing.T) { + tests := []struct { + name string + args []string + want Op + }{ + {name: "nil Args", + args: nil, + want: ListOp{}}, + {name: "empty Args", + args: []string{}, + want: ListOp{}}, + {name: "help shorthand", + args: []string{"-h"}, + want: HelpOp{}}, + {name: "help long form", + args: []string{"--help"}, + want: HelpOp{}}, + {name: "switch by name", + args: []string{"foo"}, + want: SwitchOp{Target: "foo"}}, + {name: "switch by swap", + args: []string{"-"}, + want: SwitchOp{Target: "-"}}, + {name: "unrecognized flag", + args: []string{"-x"}, + want: UnknownOp{Args: []string{"-x"}}}, + // TODO add more UnknownOp cases + + // TODO consider these cases + // - kubectx foo --help + // - kubectx -h --help + // - kubectx -d foo --h + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := parseArgs(tt.args) + + if diff := cmp.Diff(got, tt.want); diff != "" { + t.Errorf("parseArgs(%#v) diff: %s", tt.args, diff) + } + }) + } +} diff --git a/cmd/kubectx/main.go b/cmd/kubectx/main.go new file mode 100644 index 0000000..511844f --- /dev/null +++ b/cmd/kubectx/main.go @@ -0,0 +1,16 @@ +package main + +import ( + "fmt" + "os" +) + +func main() { + // parse command-line flags + argv := os.Args[1:] + fmt.Printf("%#v\n", argv) + + //var op Op + //op _= parseArgs(argv) // -> DeleteOp RenameOp HelpOp UnrecognizedFlags +} + diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..eba3a2e --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module github.com/ahmetb/kubectx + +go 1.14 + +require github.com/google/go-cmp v0.4.0 diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..4430646 --- /dev/null +++ b/go.sum @@ -0,0 +1,3 @@ +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=