Skip to content

constraint.DatetimeToleranceToNow

marrow16 edited this page Jan 21, 2023 · 5 revisions

Prev Home Next

Constraint: DatetimeToleranceToNow

Description

Check that a date/time (as an ISO string) value meets a tolerance against the current time

Note: this constraint is strict - if the property value is not a valid ISO datetime then this constraint fails

V8n Tag Abbreviation

dttolnow

Fields

Field Type Description
Duration int64 the tolerance duration amount - which can be positive, negative or zero
For negative values, this is the maximum duration into the past
For positive values, this is the maximum duration into the future
Note: If the value is zero then the behaviour is assumed to be "same" - but is then dependent on the unit specified. For example, if the Duration is zero and the Unit is specified as "year" then this constraint
Unit string is the string token specifying the unit in which the Duration is measured
This can be "millennium", "century", "decade", "year", "month", "week", "day", "hour", "min", "sec", "milli" (millisecond), "micro" (microsecond) or "nano" (nanosecond)
Note: if this is empty, then "day" is assumed. If the token is invalid - this constraint fails!
MinCheck bool when set to true, specifies that the tolerance is a minimum check (rather than the default maximum check)
ExcTime bool when set to true, excludes the time when comparing
Note: This also excludes the effect of any timezone offsets specified in either of the compared values
IgnoreNull bool when set to true, IgnoreNull makes the constraint less strict by ignoring null values
Message string the violation message to be used if the constraint fails. If empty, the default message is used
Stop bool when set to true, Stop prevents further validation checks on the property if this constraint fails

Examples

Programmatic example...
package main

import (
    "fmt"
    "time"

    "github.com/marrow16/valix"
)

func main() {
    validator := &valix.Validator{
        Properties: valix.Properties{
            "bookingDate": {
                Type: valix.JsonDatetime,
                Constraints: valix.Constraints{
                    &valix.ConstraintSet{
                        Constraints: valix.Constraints{
                            &valix.DatetimeDayOfWeek{
                                Days: "06",
                            },
                            &valix.DatetimeToleranceToNow{
                                Duration: 2,
                                Unit:     "week",
                                ExcTime:  true,
                            },
                        },
                        Message: "We only accept bookings for the next two weekends",
                    },
                },
            },
        },
    }

    now := time.Now()
    for i := 0; i < 20; i++ {
        ok, violations, _ := validator.ValidateString(fmt.Sprintf(`{"bookingDate": "%s"}`, now.Format(time.RFC3339)))
        fmt.Printf("Booking date \"%s\" ok? %v\n", now.Format("Monday, 02-Jan-06"), ok)
        if !ok {
            fmt.Printf("\tReason: %s\n", violations[0].Message)
        }

        now = now.Add(24 * time.Hour)
    }
}

try on go-playground

Struct v8n tag example...
package main

import (
    "fmt"
    "time"

    "github.com/marrow16/valix"
)

type MyStruct struct {
    BookingDate *time.Time `json:"bookingDate" v8n:"&set{constraints:[&dtdow{'06'}, &dttolnow{dur:2, unit:'week', excTime:true}], msg:'We only accept bookings for the next two weekends'}"`
}

var validator = valix.MustCompileValidatorFor(MyStruct{}, nil)

func main() {
    now := time.Now()
    for i := 0; i < 20; i++ {
        ok, violations, _ := validator.ValidateString(fmt.Sprintf(`{"bookingDate": "%s"}`, now.Format(time.RFC3339)))
        fmt.Printf("Booking date \"%s\" ok? %v\n", now.Format("Monday, 02-Jan-06"), ok)
        if !ok {
            fmt.Printf("\tReason: %s\n", violations[0].Message)
        }

        now = now.Add(24 * time.Hour)
    }
}

try on go-playground

Clone this wiki locally