Added support for time.Duration
diff --git a/properties.go b/properties.go
index 195dd77..8610622 100644
--- a/properties.go
+++ b/properties.go
@@ -13,6 +13,7 @@
"os"
"strconv"
"strings"
+ "time"
"unicode/utf8"
)
@@ -97,6 +98,29 @@
// ----------------------------------------------------------------------------
+// GetDuration parses the expanded value as an time.Duration if the key exists.
+// If key does not exist or the value cannot be parsed the default
+// value is returned.
+func (p *Properties) GetDuration(key string, def time.Duration) time.Duration {
+ v, err := p.getInt64(key)
+ if err != nil {
+ return def
+ }
+ return time.Duration(v)
+}
+
+// MustGetDuration parses the expanded value as an time.Duration if the key exists.
+// If key does not exist or the value cannot be parsed the function panics.
+func (p *Properties) MustGetDuration(key string) time.Duration {
+ v, err := p.getInt64(key)
+ if err != nil {
+ panic(err)
+ }
+ return time.Duration(v)
+}
+
+// ----------------------------------------------------------------------------
+
// GetFloat64 parses the expanded value as a float64 if the key exists.
// If key does not exist or the value cannot be parsed the default
// value is returned.
diff --git a/properties_test.go b/properties_test.go
index 6eaabb5..2563f63 100644
--- a/properties_test.go
+++ b/properties_test.go
@@ -12,6 +12,7 @@
"os"
"strings"
"testing"
+ "time"
. "launchpad.net/gocheck"
)
@@ -160,6 +161,29 @@
// ----------------------------------------------------------------------------
+type durationTest struct {
+ input, key string
+ def, value time.Duration
+}
+
+var durationTests = []*durationTest{
+ // valid values
+ &durationTest{"key = 1", "key", 999, 1},
+ &durationTest{"key = 0", "key", 999, 0},
+ &durationTest{"key = -1", "key", 999, -1},
+ &durationTest{"key = 0123", "key", 999, 123},
+
+ // invalid values
+ &durationTest{"key = 0xff", "key", 999, 999},
+ &durationTest{"key = 1.0", "key", 999, 999},
+ &durationTest{"key = a", "key", 999, 999},
+
+ // non existent key
+ &durationTest{"key = 1", "key2", 999, 999},
+}
+
+// ----------------------------------------------------------------------------
+
type floatTest struct {
input, key string
def, value float64
@@ -292,6 +316,24 @@
c.Assert(func() { p.MustGetBool("invalid") }, PanicMatches, "invalid key: invalid")
}
+func (l *TestSuite) TestGetDuration(c *C) {
+ for _, test := range durationTests {
+ p, err := parse(test.input)
+ c.Assert(err, IsNil)
+ c.Assert(p.Len(), Equals, 1)
+ c.Assert(p.GetDuration(test.key, test.def), Equals, test.value)
+ }
+}
+
+func (l *TestSuite) TestMustGetDuration(c *C) {
+ input := "key = 123\nkey2 = ghi"
+ p, err := parse(input)
+ c.Assert(err, IsNil)
+ c.Assert(p.MustGetDuration("key"), Equals, time.Duration(123))
+ c.Assert(func() { p.MustGetDuration("key2") }, PanicMatches, "strconv.ParseInt: parsing.*")
+ c.Assert(func() { p.MustGetDuration("invalid") }, PanicMatches, "invalid key: invalid")
+}
+
func (l *TestSuite) TestGetFloat64(c *C) {
for _, test := range floatTests {
p, err := parse(test.input)
@@ -425,7 +467,7 @@
func (l *TestSuite) TestPanicOn32BitIntOverflow(c *C) {
is32Bit = true
- var min, max int64 = math.MinInt32-1, math.MaxInt32+1
+ var min, max int64 = math.MinInt32 - 1, math.MaxInt32 + 1
input := fmt.Sprintf("min=%d\nmax=%d", min, max)
p, err := parse(input)
c.Assert(err, IsNil)
@@ -437,7 +479,7 @@
func (l *TestSuite) TestPanicOn32BitUintOverflow(c *C) {
is32Bit = true
- var max uint64 = math.MaxUint32+1
+ var max uint64 = math.MaxUint32 + 1
input := fmt.Sprintf("max=%d", max)
p, err := parse(input)
c.Assert(err, IsNil)