veyron/lib/flags: make it possible to set an empty string for IPHostPortFlag validation!
Change-Id: I9e5e9a24a27c9bd8cf76d4822b307979ec31453a
diff --git a/lib/flags/flags.go b/lib/flags/flags.go
index cb9dde9..bff6c4b 100644
--- a/lib/flags/flags.go
+++ b/lib/flags/flags.go
@@ -232,7 +232,7 @@
return roots, os.Getenv(consts.VeyronCredentials)
}
-// Parse parses the supplied args, as per flag.Parse
+// Parse parses the supplied args, as per flag.Parse.
func (f *Flags) Parse(args []string) error {
// TODO(cnicolaou): implement a single env var 'VANADIUM_OPTS'
// that can be used to specify any command line.
diff --git a/lib/flags/listen.go b/lib/flags/listen.go
index de2855f..929dd56 100644
--- a/lib/flags/listen.go
+++ b/lib/flags/listen.go
@@ -52,6 +52,10 @@
// Implements flag.Value.Set
func (ip *IPHostPortFlag) Set(s string) error {
+ if len(s) == 0 {
+ ip.Address, ip.Port, ip.Host = "", "", ""
+ return nil
+ }
ip.Address = s
host, port, err := net.SplitHostPort(s)
if err != nil {
@@ -87,6 +91,9 @@
// Implements flag.Value.String
func (ip IPHostPortFlag) String() string {
+ if len(ip.Address) == 0 && len(ip.Port) == 0 {
+ return ""
+ }
host := ip.Host
if len(ip.Host) == 0 && ip.IP != nil && len(ip.IP) > 0 {
// We don't have a hostname, so there should be at most one IP address.
diff --git a/lib/flags/listen_test.go b/lib/flags/listen_test.go
index 6c1fc6c..1ec6472 100644
--- a/lib/flags/listen_test.go
+++ b/lib/flags/listen_test.go
@@ -43,7 +43,7 @@
want flags.IPHostPortFlag
str string
}{
- {"", flags.IPHostPortFlag{Port: "0"}, ":0"},
+ {"", flags.IPHostPortFlag{Port: ""}, ""},
{":0", flags.IPHostPortFlag{Port: "0"}, ":0"},
{":22", flags.IPHostPortFlag{Port: "22"}, ":22"},
{"127.0.0.1", flags.IPHostPortFlag{IP: lh, Port: "0"}, "127.0.0.1:0"},
diff --git a/lib/flags/main.go b/lib/flags/main.go
new file mode 100644
index 0000000..cae781a
--- /dev/null
+++ b/lib/flags/main.go
@@ -0,0 +1,29 @@
+// +build ignore
+
+package main
+
+import (
+ "flag"
+ "fmt"
+ "os"
+
+ "veyron.io/veyron/veyron/lib/flags"
+)
+
+func main() {
+ fl := flags.CreateAndRegister(flag.CommandLine, flags.Runtime, flags.ACL, flags.Listen)
+ flag.PrintDefaults()
+ fmt.Printf("Args: %v\n", os.Args)
+ if err := fl.Parse(os.Args[1:]); err != nil {
+ fmt.Println("ERROR: %s", err)
+ return
+ }
+ rtf := fl.RuntimeFlags()
+ fmt.Printf("Runtime: Credentials: %s\n", rtf.Credentials)
+ fmt.Printf("Runtime: Namespace Roots: %s\n", rtf.NamespaceRoots)
+ lf := fl.ListenFlags()
+ fmt.Printf("Listen: Protocol %q\n", lf.ListenProtocol)
+ fmt.Printf("Listen: Address %q\n", lf.ListenAddress)
+ fmt.Printf("Listen: Proxy %q\n", lf.ListenProxy)
+ fmt.Printf("ACL: %v\n", fl.ACLFlags())
+}