authelia/internal/templates/funcs.go

79 lines
2.0 KiB
Go

package templates
import (
"fmt"
"strings"
)
// StringMapLookupDefaultEmptyFunc is function which takes a map[string]string and returns a template function which
// takes a string which is used as a key lookup for the map[string]string. If the value isn't found it returns an empty
// string.
func StringMapLookupDefaultEmptyFunc(m map[string]string) func(key string) (value string) {
return func(key string) (value string) {
var ok bool
if value, ok = m[key]; !ok {
return ""
}
return value
}
}
// StringMapLookupFunc is function which takes a map[string]string and returns a template function which
// takes a string which is used as a key lookup for the map[string]string. If the value isn't found it returns an error.
func StringMapLookupFunc(m map[string]string) func(key string) (value string, err error) {
return func(key string) (value string, err error) {
var ok bool
if value, ok = m[key]; !ok {
return value, fmt.Errorf("failed to lookup key '%s' from map", key)
}
return value, nil
}
}
// IterateFunc is a template function which takes a single uint returning a slice of units from 0 up to that number.
func IterateFunc(count *uint) (out []uint) {
var i uint
for i = 0; i < (*count); i++ {
out = append(out, i)
}
return
}
// StringsSplitFunc is a template function which takes sep and value, splitting the value by the sep into a slice.
func StringsSplitFunc(value, sep string) []string {
return strings.Split(value, sep)
}
// StringJoinXFunc takes a list of string elements, joins them by the sep string, before every int n characters are
// written it writes string p. This is useful for line breaks mostly.
func StringJoinXFunc(elems []string, sep string, n int, p string) string {
buf := strings.Builder{}
c := 0
e := len(elems) - 1
for i := 0; i <= e; i++ {
if c+len(elems[i])+1 > n {
c = 0
buf.WriteString(p)
}
c += len(elems[i]) + 1
buf.WriteString(elems[i])
if i < e {
buf.WriteString(sep)
}
}
return buf.String()
}