return x, scale, s[i:]
}
+// parseDurationError describes a problem parsing a duration string.
+type parseDurationError struct {
+ message string
+ value string
+}
+
+func (e *parseDurationError) Error() string {
+ return "time: " + e.message + " " + quote(e.value)
+}
+
var unitMap = map[string]uint64{
"ns": uint64(Nanosecond),
"us": uint64(Microsecond),
return 0, nil
}
if s == "" {
- return 0, errors.New("time: invalid duration " + quote(orig))
+ return 0, &parseDurationError{"invalid duration", orig}
}
for s != "" {
var (
// The next character must be [0-9.]
if !(s[0] == '.' || '0' <= s[0] && s[0] <= '9') {
- return 0, errors.New("time: invalid duration " + quote(orig))
+ return 0, &parseDurationError{"invalid duration", orig}
}
// Consume [0-9]*
pl := len(s)
v, s, err = leadingInt(s)
if err != nil {
- return 0, errors.New("time: invalid duration " + quote(orig))
+ return 0, &parseDurationError{"invalid duration", orig}
}
pre := pl != len(s) // whether we consumed anything before a period
}
if !pre && !post {
// no digits (e.g. ".s" or "-.s")
- return 0, errors.New("time: invalid duration " + quote(orig))
+ return 0, &parseDurationError{"invalid duration", orig}
}
// Consume unit.
}
}
if i == 0 {
- return 0, errors.New("time: missing unit in duration " + quote(orig))
+ return 0, &parseDurationError{"missing unit in duration", orig}
}
u := s[:i]
s = s[i:]
unit, ok := unitMap[u]
if !ok {
- return 0, errors.New("time: unknown unit " + quote(u) + " in duration " + quote(orig))
+ return 0, &parseDurationError{"unknown unit " + quote(u) + " in duration", orig}
}
if v > 1<<63/unit {
// overflow
- return 0, errors.New("time: invalid duration " + quote(orig))
+ return 0, &parseDurationError{"invalid duration", orig}
}
v *= unit
if f > 0 {
v += uint64(float64(f) * (float64(unit) / scale))
if v > 1<<63 {
// overflow
- return 0, errors.New("time: invalid duration " + quote(orig))
+ return 0, &parseDurationError{"invalid duration", orig}
}
}
d += v
if d > 1<<63 {
- return 0, errors.New("time: invalid duration " + quote(orig))
+ return 0, &parseDurationError{"invalid duration", orig}
}
}
if neg {
return -Duration(d), nil
}
if d > 1<<63-1 {
- return 0, errors.New("time: invalid duration " + quote(orig))
+ return 0, &parseDurationError{"invalid duration", orig}
}
return Duration(d), nil
}