115 lines
3.7 KiB
Go
115 lines
3.7 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
//"github.com/eschao/Config/cli"
|
|
)
|
|
|
|
type DBCli struct {
|
|
Host string `cli:"hostname database server hostname"`
|
|
Port string `cli:"port database server port"`
|
|
User string `cli:"user database username"`
|
|
Password string `cli:"password database user password"`
|
|
}
|
|
|
|
func main() {
|
|
|
|
countCommand := flag.NewFlagSet("count", flag.ExitOnError)
|
|
listCommand := flag.NewFlagSet("list", flag.ExitOnError)
|
|
|
|
// Count subcommand flag pointers
|
|
// Adding a new choice for --metric of 'substring' and a new --substring flag
|
|
countTextPtr := countCommand.String("text", "", "Text to parse. (Required)")
|
|
countMetricPtr := countCommand.String("metric", "chars", "Metric {chars|words|lines|substring}. (Required)")
|
|
countSubstringPtr := countCommand.String("substring", "", "The substring to be counted. Required for --metric=substring")
|
|
countUniquePtr := countCommand.Bool("unique", false, "Measure unique values of a metric.")
|
|
|
|
// List subcommand flag pointers
|
|
listTextPtr := listCommand.String("text", "", "Text to parse. (Required)")
|
|
listMetricPtr := listCommand.String("metric", "chars", "Metric <chars|words|lines>. (Required)")
|
|
listUniquePtr := listCommand.Bool("unique", false, "Measure unique values of a metric.")
|
|
|
|
// Verify that a subcommand has been provided
|
|
// os.Arg[0] is the main command
|
|
// os.Arg[1] will be the subcommand
|
|
if len(os.Args) < 2 {
|
|
//fmt.Println("list or count subcommand is required")
|
|
flag.PrintDefaults()
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Switch on the subcommand
|
|
// Parse the flags for appropriate FlagSet
|
|
// FlagSet.Parse() requires a set of arguments to parse as input
|
|
// os.Args[2:] will be all arguments starting after the subcommand at os.Args[1]
|
|
switch os.Args[1] {
|
|
case "list":
|
|
listCommand.Parse(os.Args[2:])
|
|
case "count":
|
|
countCommand.Parse(os.Args[2:])
|
|
default:
|
|
flag.PrintDefaults()
|
|
os.Exit(1)
|
|
}
|
|
|
|
// Check which subcommand was Parsed using the FlagSet.Parsed() function. Handle each case accordingly.
|
|
// FlagSet.Parse() will evaluate to false if no flags were parsed (i.e. the user did not provide any flags)
|
|
if listCommand.Parsed() {
|
|
// Required Flags
|
|
if *listTextPtr == "" {
|
|
listCommand.PrintDefaults()
|
|
os.Exit(1)
|
|
}
|
|
//Choice flag
|
|
metricChoices := map[string]bool{"chars": true, "words": true, "lines": true}
|
|
if _, validChoice := metricChoices[*listMetricPtr]; !validChoice {
|
|
listCommand.PrintDefaults()
|
|
os.Exit(1)
|
|
}
|
|
// Print
|
|
fmt.Printf("textPtr: %s, metricPtr: %s, uniquePtr: %t\n", *listTextPtr, *listMetricPtr, *listUniquePtr)
|
|
}
|
|
|
|
if countCommand.Parsed() {
|
|
// Required Flags
|
|
if *countTextPtr == "" {
|
|
countCommand.PrintDefaults()
|
|
os.Exit(1)
|
|
}
|
|
// If the metric flag is substring, the substring flag is required
|
|
if *countMetricPtr == "substring" && *countSubstringPtr == "" {
|
|
countCommand.PrintDefaults()
|
|
os.Exit(1)
|
|
}
|
|
//If the metric flag is not substring, the substring flag must not be used
|
|
if *countMetricPtr != "substring" && *countSubstringPtr != "" {
|
|
fmt.Println("--substring may only be used with --metric=substring.")
|
|
countCommand.PrintDefaults()
|
|
os.Exit(1)
|
|
}
|
|
//Choice flag
|
|
metricChoices := map[string]bool{"chars": true, "words": true, "lines": true, "substring": true}
|
|
if _, validChoice := metricChoices[*listMetricPtr]; !validChoice {
|
|
countCommand.PrintDefaults()
|
|
os.Exit(1)
|
|
}
|
|
//Print
|
|
fmt.Printf("textPtr: %s, metricPtr: %s, substringPtr: %v, uniquePtr: %t\n", *countTextPtr, *countMetricPtr, *countSubstringPtr, *countUniquePtr)
|
|
}
|
|
/*
|
|
config := DBCli{}
|
|
root := cli.CliFlag{}
|
|
err := cli.Parse(&config, &root)
|
|
|
|
if err != nil {
|
|
fmt.Printf("Can't parse cli. %s", err.Error())
|
|
}
|
|
flag.Parse()
|
|
|
|
fmt.Printf("Host=%s\n", config.Host)
|
|
*/
|
|
|
|
}
|