func StringF(d StringFDefaults) func(format string, args ...interface{}) (string, error) {
	return func(format string, args ...interface{}) (string, error) {
		fargs := []interface{}{}
		verbs := verbPattern.FindAllString(format, -1)
		var min int64
		var max int64
		var pattern string
		var argIndex int
		var err error
		for _, v := range verbs {
			switch v[1:] {
			case "d":
				min, max, argIndex, err = intArgs(argIndex, d, args...)
				if err != nil {
					return "", errors.Wrap(err, "generating integer placeholder")
				}
				fargs = append(fargs, Int(min, max))
			case "s":
				min, max, pattern, argIndex, err = stringArgs(argIndex, d, args...)
				if err != nil {
					return "", errors.Wrap(err, "generating string placeholder")
				}
				fargs = append(fargs, String(min, max, pattern))
			}
		}
		return fmt.Sprintf(format, fargs...), nil
	}
}
StringF returns a random string built around a format string.
package random
import (
	"fmt"
	"math/rand"
	"regexp"
	"strings"
	"time"
	"github.com/pkg/errors"
)
var (
	utcNow = func() time.Time { return time.Now().UTC() }
	ascii = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
	verbPattern = regexp.MustCompile("%[sd]{1}")
)
func String(min, max int64, set string) string {
	var length int64
	if min == max {
		length = min
	} else {
		length = between64(min, max)
	}
	runes := ascii
	if set != "" {
		runes = []rune(set)
	}
	output := []rune{}
	for i := 0; i < int(length); i++ {
		output = append(output, runes[rand.Intn(len(runes))])
	}
	return string(output)
}