From c5f12920b0879498b0a20342650a09b0ad5c9d7c Mon Sep 17 00:00:00 2001 From: r Date: Sun, 2 Jan 2022 11:15:57 +0000 Subject: Use GO's flag parser instead of getopt There's only one flag, so it doesn't matter. --- main.go | 15 +++---- util/getopt.go | 122 --------------------------------------------------------- 2 files changed, 5 insertions(+), 132 deletions(-) delete mode 100644 util/getopt.go diff --git a/main.go b/main.go index 85ee6cc..3b5ccba 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( "errors" + "flag" "fmt" "log" "net/http" @@ -26,18 +27,12 @@ func errExit(err error) { } func main() { - opts, _, err := util.Getopts(os.Args, "f:") - if err != nil { - errExit(err) - } + configFile := flag.String("f", "", "config file") + flag.Parse() - for _, opt := range opts { - switch opt.Option { - case 'f': - configFiles = []string{opt.Value} - } + if len(*configFile) > 0 { + configFiles = []string{*configFile} } - config, err := config.ParseFiles(configFiles) if err != nil { errExit(err) diff --git a/util/getopt.go b/util/getopt.go deleted file mode 100644 index 10926a8..0000000 --- a/util/getopt.go +++ /dev/null @@ -1,122 +0,0 @@ -/* -Copyright 2019 Drew DeVault - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this -list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors -may be used to endorse or promote products derived from this software without -specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -package util - -import ( - "fmt" - "os" -) - -// In the case of "-o example", Option is 'o' and "example" is Value. For -// options which do not take an argument, Value is "". -type Option struct { - Option rune - Value string -} - -// This is returned when an unknown option is found in argv, but not in the -// option spec. -type UnknownOptionError rune - -func (e UnknownOptionError) Error() string { - return fmt.Sprintf("%s: unknown option -%c", os.Args[0], rune(e)) -} - -// This is returned when an option with a mandatory argument is missing that -// argument. -type MissingOptionError rune - -func (e MissingOptionError) Error() string { - return fmt.Sprintf("%s: expected argument for -%c", os.Args[0], rune(e)) -} - -// Getopts implements a POSIX-compatible options interface. -// -// Returns a slice of options and the index of the first non-option argument. -// -// If an error is returned, you must print it to stderr to be POSIX complaint. -func Getopts(argv []string, spec string) ([]Option, int, error) { - optmap := make(map[rune]bool) - runes := []rune(spec) - for i, rn := range spec { - if rn == ':' { - if i == 0 { - continue - } - optmap[runes[i-1]] = true - } else { - optmap[rn] = false - } - } - - var ( - i int - opts []Option - ) - for i = 1; i < len(argv); i++ { - arg := argv[i] - runes = []rune(arg) - if len(arg) == 0 || arg == "-" { - break - } - if arg[0] != '-' { - break - } - if arg == "--" { - i++ - break - } - for j, opt := range runes[1:] { - if optopt, ok := optmap[opt]; !ok { - opts = append(opts, Option{'?', ""}) - return opts, i, UnknownOptionError(opt) - } else if optopt { - if j+1 < len(runes)-1 { - opts = append(opts, Option{opt, string(runes[j+2:])}) - break - } else { - if i+1 >= len(argv) { - if len(spec) >= 1 && spec[0] == ':' { - opts = append(opts, Option{':', string(opt)}) - } else { - return opts, i, MissingOptionError(opt) - } - } else { - opts = append(opts, Option{opt, argv[i+1]}) - i++ - } - } - } else { - opts = append(opts, Option{opt, ""}) - } - } - } - return opts, i, nil -} -- cgit v1.2.3