| Index: go/src/infra/libs/clock/clockflag/duration.go
|
| diff --git a/go/src/infra/libs/clock/clockflag/duration.go b/go/src/infra/libs/clock/clockflag/duration.go
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..bddccb657f181645286d39fc3b3386a466703a1f
|
| --- /dev/null
|
| +++ b/go/src/infra/libs/clock/clockflag/duration.go
|
| @@ -0,0 +1,61 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package clockflag
|
| +
|
| +import (
|
| + "errors"
|
| + "flag"
|
| + "fmt"
|
| + "time"
|
| +)
|
| +
|
| +// Duration is a Flag- and JSON-compatible Duration value.
|
| +type Duration time.Duration
|
| +
|
| +var _ flag.Value = (*Duration)(nil)
|
| +
|
| +// Set implements flag.Value.
|
| +func (d *Duration) Set(value string) error {
|
| + duration, err := time.ParseDuration(value)
|
| + if err != nil {
|
| + return err
|
| + }
|
| + *d = Duration(duration)
|
| + return nil
|
| +}
|
| +
|
| +func (d *Duration) String() string {
|
| + return time.Duration(*d).String()
|
| +}
|
| +
|
| +// Duration returns the Duration value of the flag.
|
| +func (d Duration) Duration() time.Duration {
|
| + return time.Duration(d)
|
| +}
|
| +
|
| +// IsZero tests if this Duration is the zero value.
|
| +func (d Duration) IsZero() bool {
|
| + return time.Duration(d) == time.Duration(0)
|
| +}
|
| +
|
| +// UnmarshalJSON implements json.Unmarshaler.
|
| +//
|
| +// Unmarshals a JSON entry into the underlying type. The entry is expected to
|
| +// contain a string corresponding to one of the enum's keys.
|
| +func (d *Duration) UnmarshalJSON(data []byte) error {
|
| + // Strip off leading and trailing quotes.
|
| + s := string(data)
|
| + if len(s) < 2 || s[0] != '"' || s[len(s)-1] != '"' {
|
| + return errors.New("Duration JSON must be a valid JSON string.")
|
| + }
|
| + return d.Set(s[1 : len(s)-1])
|
| +}
|
| +
|
| +// MarshalJSON implements json.Marshaler.
|
| +//
|
| +// Marshals a Duration into a duration string.
|
| +func (d Duration) MarshalJSON() ([]byte, error) {
|
| + return []byte(fmt.Sprintf(`"%s"`, d.Duration().String())), nil
|
| +}
|
|
|