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 }