github.com/System-Glitch/goyave/v2@v2.10.3-0.20200819142921-51011e75d504/validation/dates.go (about)

     1  package validation
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  )
     7  
     8  func parseDate(date interface{}, format string) (time.Time, error) {
     9  	str, ok := date.(string)
    10  	if ok {
    11  		t, err := time.Parse(format, str)
    12  		if err == nil {
    13  			return t, err
    14  		}
    15  		return t, err
    16  	}
    17  	return time.Time{}, fmt.Errorf("Date is not a string so cannot be parsed")
    18  }
    19  
    20  func getDates(value interface{}, parameters []string, form map[string]interface{}) ([]time.Time, error) {
    21  	dates := []time.Time{}
    22  	date, ok := value.(time.Time)
    23  	if ok {
    24  		dates = append(dates, date)
    25  		for _, param := range parameters {
    26  			other, exists := form[param]
    27  			if exists {
    28  				otherDate, ok := other.(time.Time)
    29  				if !ok {
    30  					t, err := parseDate(other, "2006-01-02")
    31  					if err != nil {
    32  						return dates, fmt.Errorf("Cannot parse date in other field")
    33  					}
    34  					otherDate = t
    35  				}
    36  				dates = append(dates, otherDate)
    37  				continue
    38  			}
    39  
    40  			t, err := parseDate(param, "2006-01-02T15:04:05")
    41  			if err != nil {
    42  				panic(err)
    43  			}
    44  			dates = append(dates, t)
    45  		}
    46  
    47  		return dates, nil
    48  	}
    49  	return dates, fmt.Errorf("Value is not a date")
    50  }
    51  
    52  func validateDate(field string, value interface{}, parameters []string, form map[string]interface{}) bool {
    53  	if len(parameters) == 0 {
    54  		parameters = append(parameters, "2006-01-02")
    55  	}
    56  
    57  	t, err := parseDate(value, parameters[0])
    58  	if err == nil {
    59  		form[field] = t
    60  		return true
    61  	}
    62  	return false
    63  }
    64  
    65  func validateBefore(field string, value interface{}, parameters []string, form map[string]interface{}) bool {
    66  	dates, err := getDates(value, parameters, form)
    67  	return err == nil && dates[0].Before(dates[1])
    68  }
    69  
    70  func validateBeforeEqual(field string, value interface{}, parameters []string, form map[string]interface{}) bool {
    71  	dates, err := getDates(value, parameters, form)
    72  	return err == nil && (dates[0].Before(dates[1]) || dates[0].Equal(dates[1]))
    73  }
    74  
    75  func validateAfter(field string, value interface{}, parameters []string, form map[string]interface{}) bool {
    76  	dates, err := getDates(value, parameters, form)
    77  	return err == nil && dates[0].After(dates[1])
    78  }
    79  
    80  func validateAfterEqual(field string, value interface{}, parameters []string, form map[string]interface{}) bool {
    81  	dates, err := getDates(value, parameters, form)
    82  	return err == nil && (dates[0].After(dates[1]) || dates[0].Equal(dates[1]))
    83  }
    84  
    85  func validateDateEquals(field string, value interface{}, parameters []string, form map[string]interface{}) bool {
    86  	dates, err := getDates(value, parameters, form)
    87  	return err == nil && dates[0].Equal(dates[1])
    88  }
    89  
    90  func validateDateBetween(field string, value interface{}, parameters []string, form map[string]interface{}) bool {
    91  	dates, err := getDates(value, parameters, form)
    92  	return err == nil && (dates[0].After(dates[1]) || dates[0].Equal(dates[1])) && (dates[0].Before(dates[2]) || dates[0].Equal(dates[2]))
    93  }