github.com/goravel/framework@v1.13.9/validation/options.go (about)

     1  package validation
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/gookit/validate"
     7  
     8  	"github.com/goravel/framework/contracts/http"
     9  	httpvalidate "github.com/goravel/framework/contracts/validation"
    10  )
    11  
    12  func Rules(rules map[string]string) httpvalidate.Option {
    13  	return func(options map[string]any) {
    14  		if len(rules) > 0 {
    15  			options["rules"] = rules
    16  		}
    17  	}
    18  }
    19  
    20  func CustomRules(rules []httpvalidate.Rule) httpvalidate.Option {
    21  	return func(options map[string]any) {
    22  		if len(rules) > 0 {
    23  			options["customRules"] = rules
    24  		}
    25  	}
    26  }
    27  
    28  func Messages(messages map[string]string) httpvalidate.Option {
    29  	return func(options map[string]any) {
    30  		if len(messages) > 0 {
    31  			options["messages"] = messages
    32  		}
    33  	}
    34  }
    35  
    36  func Attributes(attributes map[string]string) httpvalidate.Option {
    37  	return func(options map[string]any) {
    38  		if len(attributes) > 0 {
    39  			options["attributes"] = attributes
    40  		}
    41  	}
    42  }
    43  
    44  func PrepareForValidation(prepare func(data httpvalidate.Data) error) httpvalidate.Option {
    45  	return func(options map[string]any) {
    46  		options["prepareForValidation"] = func(ctx http.Context, data httpvalidate.Data) error {
    47  			return prepare(data)
    48  		}
    49  	}
    50  }
    51  
    52  func GenerateOptions(options []httpvalidate.Option) map[string]any {
    53  	realOptions := make(map[string]any)
    54  	for _, option := range options {
    55  		option(realOptions)
    56  	}
    57  
    58  	return realOptions
    59  }
    60  
    61  func AppendOptions(validator *validate.Validation, options map[string]any) {
    62  	if options["rules"] != nil {
    63  		rules := options["rules"].(map[string]string)
    64  		for key, value := range rules {
    65  			validator.StringRule(key, value)
    66  		}
    67  	}
    68  
    69  	if options["messages"] != nil {
    70  		messages := options["messages"].(map[string]string)
    71  		for key, value := range messages {
    72  			messages[key] = strings.ReplaceAll(value, ":attribute", "{field}")
    73  		}
    74  		validator.AddMessages(messages)
    75  	}
    76  
    77  	if options["attributes"] != nil && len(options["attributes"].(map[string]string)) > 0 {
    78  		validator.AddTranslates(options["attributes"].(map[string]string))
    79  	}
    80  
    81  	if options["customRules"] != nil {
    82  		customRules := options["customRules"].([]httpvalidate.Rule)
    83  		for _, customRule := range customRules {
    84  			customRule := customRule
    85  			validator.AddMessages(map[string]string{
    86  				customRule.Signature(): strings.ReplaceAll(customRule.Message(), ":attribute", "{field}"),
    87  			})
    88  			validator.AddValidator(customRule.Signature(), func(val any, options ...any) bool {
    89  				return customRule.Passes(validator, val, options...)
    90  			})
    91  		}
    92  	}
    93  
    94  	validator.Trans().FieldMap()
    95  }