date.go raw

   1  /*
   2  Package date provides time.Time derivatives that conform to the Swagger.io (https://swagger.io/)
   3  defined date   formats: Date and DateTime. Both types may, in most cases, be used in lieu of
   4  time.Time types. And both convert to time.Time through a ToTime method.
   5  */
   6  package date
   7  
   8  // Copyright 2017 Microsoft Corporation
   9  //
  10  //  Licensed under the Apache License, Version 2.0 (the "License");
  11  //  you may not use this file except in compliance with the License.
  12  //  You may obtain a copy of the License at
  13  //
  14  //      http://www.apache.org/licenses/LICENSE-2.0
  15  //
  16  //  Unless required by applicable law or agreed to in writing, software
  17  //  distributed under the License is distributed on an "AS IS" BASIS,
  18  //  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  19  //  See the License for the specific language governing permissions and
  20  //  limitations under the License.
  21  
  22  import (
  23  	"fmt"
  24  	"time"
  25  )
  26  
  27  const (
  28  	fullDate     = "2006-01-02"
  29  	fullDateJSON = `"2006-01-02"`
  30  	dateFormat   = "%04d-%02d-%02d"
  31  	jsonFormat   = `"%04d-%02d-%02d"`
  32  )
  33  
  34  // Date defines a type similar to time.Time but assumes a layout of RFC3339 full-date (i.e.,
  35  // 2006-01-02).
  36  type Date struct {
  37  	time.Time
  38  }
  39  
  40  // ParseDate create a new Date from the passed string.
  41  func ParseDate(date string) (d Date, err error) {
  42  	return parseDate(date, fullDate)
  43  }
  44  
  45  func parseDate(date string, format string) (Date, error) {
  46  	d, err := time.Parse(format, date)
  47  	return Date{Time: d}, err
  48  }
  49  
  50  // MarshalBinary preserves the Date as a byte array conforming to RFC3339 full-date (i.e.,
  51  // 2006-01-02).
  52  func (d Date) MarshalBinary() ([]byte, error) {
  53  	return d.MarshalText()
  54  }
  55  
  56  // UnmarshalBinary reconstitutes a Date saved as a byte array conforming to RFC3339 full-date (i.e.,
  57  // 2006-01-02).
  58  func (d *Date) UnmarshalBinary(data []byte) error {
  59  	return d.UnmarshalText(data)
  60  }
  61  
  62  // MarshalJSON preserves the Date as a JSON string conforming to RFC3339 full-date (i.e.,
  63  // 2006-01-02).
  64  func (d Date) MarshalJSON() (json []byte, err error) {
  65  	return []byte(fmt.Sprintf(jsonFormat, d.Year(), d.Month(), d.Day())), nil
  66  }
  67  
  68  // UnmarshalJSON reconstitutes the Date from a JSON string conforming to RFC3339 full-date (i.e.,
  69  // 2006-01-02).
  70  func (d *Date) UnmarshalJSON(data []byte) (err error) {
  71  	d.Time, err = time.Parse(fullDateJSON, string(data))
  72  	return err
  73  }
  74  
  75  // MarshalText preserves the Date as a byte array conforming to RFC3339 full-date (i.e.,
  76  // 2006-01-02).
  77  func (d Date) MarshalText() (text []byte, err error) {
  78  	return []byte(fmt.Sprintf(dateFormat, d.Year(), d.Month(), d.Day())), nil
  79  }
  80  
  81  // UnmarshalText reconstitutes a Date saved as a byte array conforming to RFC3339 full-date (i.e.,
  82  // 2006-01-02).
  83  func (d *Date) UnmarshalText(data []byte) (err error) {
  84  	d.Time, err = time.Parse(fullDate, string(data))
  85  	return err
  86  }
  87  
  88  // String returns the Date formatted as an RFC3339 full-date string (i.e., 2006-01-02).
  89  func (d Date) String() string {
  90  	return fmt.Sprintf(dateFormat, d.Year(), d.Month(), d.Day())
  91  }
  92  
  93  // ToTime returns a Date as a time.Time
  94  func (d Date) ToTime() time.Time {
  95  	return d.Time
  96  }
  97