From 79786009ced7c10d15ddc495f395965f1a4a7a94 Mon Sep 17 00:00:00 2001 From: Zeal Jagannatha Date: Mon, 23 Nov 2015 19:55:46 -0800 Subject: [PATCH] Added support for regexp flags --- flags_test.go | 11 +++++++++++ parsers.go | 13 +++++++++++++ values.go | 29 +++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/flags_test.go b/flags_test.go index 64a3be5..9528e64 100644 --- a/flags_test.go +++ b/flags_test.go @@ -107,3 +107,14 @@ func TestRequiredWithEnvar(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 123, *flag) } + +func TestRegexp(t *testing.T) { + app := New("test", "") + flag := app.Flag("reg", "").Regexp() + _, err := app.Parse([]string{"--reg", "^abc$"}) + assert.NoError(t, err) + assert.NotNil(t, *flag) + assert.Equal(t, "^abc$", (*flag).String()) + assert.Regexp(t, *flag, "abc") + assert.NotRegexp(t, *flag, "abcd") +} diff --git a/parsers.go b/parsers.go index d9ad57e..3144fc1 100644 --- a/parsers.go +++ b/parsers.go @@ -4,6 +4,7 @@ import ( "net" "net/url" "os" + "regexp" "time" "github.com/alecthomas/units" @@ -210,3 +211,15 @@ func (p *parserMixin) Counter() (target *int) { func (p *parserMixin) CounterVar(target *int) { p.SetValue(newCounterValue(target)) } + +// Regexp +func (p *parserMixin) Regexp() (target **regexp.Regexp) { + target = new(*regexp.Regexp) + p.RegexpVar(target) + return +} + +// Regexp +func (p *parserMixin) RegexpVar(target **regexp.Regexp) { + p.SetValue(newRegexpValue(target)) +} diff --git a/values.go b/values.go index dbbb0e0..23ee87b 100644 --- a/values.go +++ b/values.go @@ -445,3 +445,32 @@ func (c *counterValue) Set(s string) error { func (c *counterValue) Get() interface{} { return (int)(*c) } func (c *counterValue) IsBoolFlag() bool { return true } func (c *counterValue) String() string { return fmt.Sprintf("%d", *c) } + +// -- regexp.Regexp value +type regexpValue struct { + r **regexp.Regexp +} + +func newRegexpValue(r **regexp.Regexp) *regexpValue { + return ®expValue{r} +} + +func (r *regexpValue) Set(value string) error { + if re, err := regexp.Compile(value); err != nil { + return err + } else { + *r.r = re + return nil + } +} + +func (r *regexpValue) Get() interface{} { + return (*regexp.Regexp)(*r.r) +} + +func (r *regexpValue) String() string { + if *r.r == nil { + return "" + } + return (*r.r).String() +}