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

     1  package validation
     2  
     3  import (
     4  	"sort"
     5  	"strings"
     6  	"time"
     7  
     8  	"github.com/System-Glitch/goyave/v2/lang"
     9  )
    10  
    11  // Placeholder function defining a placeholder in a validation message.
    12  // This function should return the value to replace the placeholder with.
    13  type Placeholder func(string, string, []string, string) string
    14  
    15  var placeholders map[string]Placeholder = map[string]Placeholder{}
    16  var sortedKeys []string = []string{}
    17  
    18  // SetPlaceholder sets the replacer function for the given placeholder.
    19  // If a placeholder with this name already exists, the latter will be overridden.
    20  //  validation.SetPlaceholder("min", func(field string, rule string, parameters []string, language string) string {
    21  //  	return parameters[0] // Replace ":min" by the first parameter in the rule definition
    22  //  })
    23  func SetPlaceholder(placeholderName string, replacer Placeholder) {
    24  	key := ":" + placeholderName
    25  	placeholders[key] = replacer
    26  
    27  	// Sort keys to process placeholders in order.
    28  	// Needed to avoid conflict between "values" and "value" for example.
    29  	sortedKeys = append(sortedKeys, key)
    30  	sort.Sort(sort.Reverse(sort.StringSlice(sortedKeys)))
    31  }
    32  
    33  func processPlaceholders(field string, rule string, params []string, message string, language string) string {
    34  	for _, placeholder := range sortedKeys {
    35  		if strings.Contains(message, placeholder) {
    36  			replacer := placeholders[placeholder]
    37  			message = strings.ReplaceAll(message, placeholder, replacer(field, rule, params, language))
    38  		}
    39  	}
    40  	return message
    41  }
    42  
    43  func replaceField(field, language string) string {
    44  	entry := "validation.fields." + field
    45  	attr := lang.Get(language, entry)
    46  	if attr == entry {
    47  		return field
    48  	}
    49  	return attr
    50  }
    51  
    52  func simpleParameterPlaceholder(field string, rule string, parameters []string, language string) string {
    53  	return parameters[0]
    54  }
    55  
    56  func datePlaceholder(index int, parameters []string, language string) string {
    57  	_, err := time.Parse("2006-01-02T15:04:05", parameters[index])
    58  	if err != nil {
    59  		// Not a date, may be a field
    60  		return replaceField(parameters[index], language)
    61  	}
    62  	return parameters[index]
    63  }
    64  
    65  func init() {
    66  	SetPlaceholder("field", func(field string, rule string, parameters []string, language string) string {
    67  		return replaceField(field, language)
    68  	})
    69  	SetPlaceholder("value", simpleParameterPlaceholder)
    70  	SetPlaceholder("min", simpleParameterPlaceholder)
    71  	SetPlaceholder("max", func(field string, rule string, parameters []string, language string) string {
    72  		index := 0
    73  		if strings.Contains(rule, "between") {
    74  			index = 1
    75  		}
    76  		return parameters[index]
    77  	})
    78  	SetPlaceholder("other", func(field string, rule string, parameters []string, language string) string {
    79  		return replaceField(parameters[0], language)
    80  	})
    81  	SetPlaceholder("values", func(field string, rule string, parameters []string, language string) string {
    82  		return strings.Join(parameters, ", ")
    83  	})
    84  	SetPlaceholder("version", func(field string, rule string, parameters []string, language string) string {
    85  		if len(parameters) > 0 {
    86  			return "v" + parameters[0]
    87  		}
    88  		return ""
    89  	})
    90  	SetPlaceholder("date", func(field string, rule string, parameters []string, language string) string {
    91  		return datePlaceholder(0, parameters, language)
    92  	})
    93  	SetPlaceholder("max_date", func(field string, rule string, parameters []string, language string) string {
    94  		return datePlaceholder(1, parameters, language)
    95  	})
    96  }