github.com/lyft/flytestdlib@v0.3.12-0.20210213045714-8cdd111ecda1/config/duration.go (about)

     1  package config
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"time"
     7  )
     8  
     9  // A wrapper around time.Duration that enables Json Marshalling capabilities
    10  type Duration struct {
    11  	time.Duration
    12  }
    13  
    14  func (d Duration) MarshalJSON() ([]byte, error) {
    15  	return json.Marshal(d.String())
    16  }
    17  
    18  func (d *Duration) UnmarshalJSON(b []byte) error {
    19  	if len(b) == 0 {
    20  		d.Duration = time.Duration(0)
    21  		return nil
    22  	}
    23  
    24  	var v interface{}
    25  	if err := json.Unmarshal(b, &v); err != nil {
    26  		return err
    27  	}
    28  	switch value := v.(type) {
    29  	case float64:
    30  		d.Duration = time.Duration(value)
    31  		return nil
    32  	case string:
    33  		if len(value) == 0 {
    34  			d.Duration = time.Duration(0)
    35  		} else {
    36  			var err error
    37  			d.Duration, err = time.ParseDuration(value)
    38  			if err != nil {
    39  				return err
    40  			}
    41  		}
    42  	default:
    43  		return errors.New("invalid duration")
    44  	}
    45  
    46  	return nil
    47  }