mirror of https://github.com/perkeep/perkeep.git
blobref: enforce Go1.1 is required,
also types: rm Go1.0 RFC3339Nanos work-around Change-Id: I9ce8495927fe349e7882f0a7d6c4f0051693fa2c
This commit is contained in:
parent
d8e8674582
commit
481bdf346a
|
@ -0,0 +1,5 @@
|
|||
// +build !go1.1
|
||||
|
||||
package blobref
|
||||
|
||||
Sorry, Camlistore requires Go 1.1.
|
|
@ -21,13 +21,11 @@ import (
|
|||
"fmt"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
goVersion = runtime.Version()
|
||||
isGo10 = goVersion == "go1" || strings.HasPrefix(runtime.Version(), "go1.0")
|
||||
dotNumbers = regexp.MustCompile(`\.\d+`)
|
||||
)
|
||||
|
||||
|
@ -40,7 +38,6 @@ var (
|
|||
_ json.Unmarshaler = (*Time3339)(nil)
|
||||
)
|
||||
|
||||
|
||||
func (t Time3339) String() string {
|
||||
return time.Time(t).UTC().Format(time.RFC3339Nano)
|
||||
}
|
||||
|
@ -49,65 +46,35 @@ func (t Time3339) MarshalJSON() ([]byte, error) {
|
|||
return json.Marshal(t.String())
|
||||
}
|
||||
|
||||
func parseForGo10(s string) (time.Time, error) {
|
||||
var numbers string
|
||||
noNanos := dotNumbers.ReplaceAllStringFunc(s, func(m string) string {
|
||||
numbers = m
|
||||
return ""
|
||||
})
|
||||
t, err := time.Parse(time.RFC3339, noNanos)
|
||||
if err != nil {
|
||||
return t, fmt.Errorf("Failed to parse %q as an RFC 3339 time: %v", noNanos, err)
|
||||
}
|
||||
if numbers != "" {
|
||||
nanos, err := time.ParseDuration(numbers + "s")
|
||||
if err != nil {
|
||||
return t, fmt.Errorf("Failed to parse %q as a duration: %v", numbers+"s", err)
|
||||
}
|
||||
t = t.Add(nanos)
|
||||
}
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func (t *Time3339) UnmarshalJSON(b []byte) error {
|
||||
if len(b) < 2 || b[0] != '"' || b[len(b)-1] != '"' {
|
||||
return fmt.Errorf("types: failed to unmarshal non-string value %q as an RFC 3339 time")
|
||||
}
|
||||
tm, err := ParseTime3339(string(b[1 : len(b)-1]))
|
||||
tm, err := time.Parse(time.RFC3339Nano, string(b[1:len(b)-1]))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
*t = tm
|
||||
*t = Time3339(tm)
|
||||
return nil
|
||||
}
|
||||
|
||||
// ParseTime3339 parses a string in RFC3339 format.
|
||||
func ParseTime3339(v string) (t Time3339, err error) {
|
||||
var tm time.Time
|
||||
if isGo10 {
|
||||
tm, err = parseForGo10(v)
|
||||
} else {
|
||||
tm, err = time.Parse(time.RFC3339Nano, v)
|
||||
}
|
||||
return Time3339(tm), err
|
||||
}
|
||||
|
||||
// ParseTime3339 parses a string in RFC3339 format. If it's invalid,
|
||||
// ParseTime3339OrZero parses a string in RFC3339 format. If it's invalid,
|
||||
// the zero time value is returned instead.
|
||||
func ParseTime3339OrZero(v string) Time3339 {
|
||||
t, err := ParseTime3339(v)
|
||||
t, err := time.Parse(time.RFC3339Nano, v)
|
||||
if err != nil {
|
||||
return Time3339{}
|
||||
}
|
||||
return t
|
||||
return Time3339(t)
|
||||
}
|
||||
|
||||
func ParseTime3339OrZil(v string) *Time3339 {
|
||||
t, err := ParseTime3339(v)
|
||||
t, err := time.Parse(time.RFC3339Nano, v)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
return &t
|
||||
tm := Time3339(t)
|
||||
return &tm
|
||||
}
|
||||
|
||||
// Time returns the time as a time.Time with slightly less stutter
|
||||
|
|
Loading…
Reference in New Issue