Skip to content

constraint.StringContains

marrow16 edited this page Jan 21, 2023 · 6 revisions

Prev Home Next

Constraint: StringContains

Description

Check that a string contains with a given value

Note: By default, this constraint is non-strict - if the value being checked is not a string, this constraint does not fail (unless the Strict field is set)

V8n Tag Abbreviation

contains

Fields

Field Type Description
Value string the value to check that the string contains
Values []string multiple additional values that the string may contain
CaseInsensitive bool whether the check is case-insensitive (by default, the check is case-sensitive)
Not bool whether the check is NOT-ed (i.e. checks that the string does not contain)
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
Strict bool when set to true, fails if the value being checked is not a correct type

Examples

Programmatic example...
package main

import (
    "fmt"

    "github.com/marrow16/valix"
)

func main() {
    validator := &valix.Validator{
        Properties: valix.Properties{
            "foo": {
                Type: valix.JsonString,
                Constraints: valix.Constraints{
                    &valix.StringContains{
                        Values:          []string{"foo", "bar", "baz", "qux"},
                        CaseInsensitive: true,
                        Not:             true,
                        Message:         "Must not contain 'foo', 'bar', 'baz' or 'qux'",
                    },
                },
            },
        },
    }

    ok, violations, _ := validator.ValidateString(`{"foo": "this has Foo in it"}`)
    fmt.Printf("Passed? %v\n", ok)
    for i, v := range violations {
        fmt.Printf("Violation[%d] Message: %s, Property: %s, Path: %s\n", i+1, v.Message, v.Property, v.Path)
    }

    ok, violations, _ = validator.ValidateString(`{"foo": "this is ok"}`)
    fmt.Printf("Passed? %v\n", ok)
    for i, v := range violations {
        fmt.Printf("Violation[%d] Message: %s, Property: %s, Path: %s\n", i+1, v.Message, v.Property, v.Path)
    }
}

try on go-playground

Struct v8n tag example...
package main

import (
    "fmt"

    "github.com/marrow16/valix"
)

type MyStruct struct {
    Foo string `json:"foo" v8n:"&contains{values:['foo','bar','baz','qux'], insensitive:true, not:true, msg:\"Must not contain 'foo', 'bar', 'baz' or 'qux'\"}"`
}

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

func main() {
    my := &MyStruct{}

    ok, violations, _ := validator.ValidateStringInto(`{"foo": "this has Foo in it"}`, my)
    fmt.Printf("Passed? %v\n", ok)
    for i, v := range violations {
        fmt.Printf("Violation[%d] Message: %s, Property: %s, Path: %s\n", i+1, v.Message, v.Property, v.Path)
    }

    ok, violations, _ = validator.ValidateStringInto(`{"foo": "this is ok"}`, my)
    fmt.Printf("Passed? %v\n", ok)
    for i, v := range violations {
        fmt.Printf("Violation[%d] Message: %s, Property: %s, Path: %s\n", i+1, v.Message, v.Property, v.Path)
    }
}

try on go-playground

Clone this wiki locally