Code review comment for lp:~jbaikge/goyaml/time.Duration-support

Revision history for this message
Jake T (jbaikge) wrote :

Reviewers: mp+171337_code.launchpad.net,

Message:
Please take a look.

Description:
Add time.Duration Support

Adds support for parsing time.Duration values (eg 10m, 42s, etc.) into
vars or
fields of type time.Duration. Support for using integer values remains.

https://code.launchpad.net/~jbaikge/goyaml/time.Duration-support/+merge/171337

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/10548043/

Affected files:
   A [revision details]
   M decode.go
   M decode_test.go

Index: [revision details]
=== added file '[revision details]'
--- [revision details] 2012-01-01 00:00:00 +0000
+++ [revision details] 2012-01-01 00:00:00 +0000
@@ -0,0 +1,2 @@
+Old revision: <email address hidden>
+New revision: jake@sable-20130625151823-ry78brqct2dp1e47

Index: decode.go
=== modified file 'decode.go'
--- decode.go 2013-06-19 17:52:23 +0000
+++ decode.go 2013-06-25 15:18:23 +0000
@@ -3,6 +3,7 @@
  import (
   "reflect"
   "strconv"
+ "time"
  )

  const (
@@ -23,6 +24,8 @@
   anchors map[string]*node
  }

+var durationType = reflect.TypeOf(time.Duration(0))
+
  //
----------------------------------------------------------------------------
  // Parser, produces a node tree out of a libyaml event stream.

@@ -315,6 +318,12 @@
      out.SetInt(resolved)
      good = true
     }
+ case string:
+ if out.Type() == durationType {
+ d, err := time.ParseDuration(resolved)
+ out.SetInt(d.Nanoseconds())
+ good = err == nil
+ }
    }
   case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,
reflect.Uint64, reflect.Uintptr:
    switch resolved := resolved.(type) {

Index: decode_test.go
=== modified file 'decode_test.go'
--- decode_test.go 2013-06-19 18:05:58 +0000
+++ decode_test.go 2013-06-25 15:18:23 +0000
@@ -5,6 +5,7 @@
   "launchpad.net/goyaml"
   "math"
   "reflect"
+ "time"
  )

  var unmarshalIntTest = 123
@@ -341,6 +342,30 @@
     C inlineB `yaml:",inline"`
    }{1, inlineB{2, inlineC{3}}},
   },
+
+ // Durations
+ {
+ "a: 10m",
+ &struct{ A time.Duration }{10 * time.Minute},
+ },
+ {
+ "a: 10m5s",
+ &struct{ A time.Duration }{10*time.Minute + 5*time.Second},
+ },
+ {
+ "a: 10ms",
+ &struct{ A time.Duration }{10 * time.Millisecond},
+ },
+ {
+ "a: 1h2m3.004005006s",
+ &struct{ A time.Duration }{
+ 1*time.Hour + 2*time.Minute + 3*time.Second + 4*time.Millisecond +
5*time.Microsecond + 6*time.Nanosecond,
+ },
+ },
+ {
+ "a: 42",
+ &struct{ A time.Duration }{time.Duration(42)},
+ },
  }

  type inlineB struct {

« Back to merge proposal