github.com/coveo/gotemplate@v2.7.7+incompatible/template/extra_sprig.go (about)

     1  package template
     2  
     3  import (
     4  	"github.com/Masterminds/sprig"
     5  )
     6  
     7  const (
     8  	sprigCrypto         = "Sprig Cryptographic & Security, http://masterminds.github.io/sprig/crypto.html"
     9  	sprigDate           = "Sprig Date, http://masterminds.github.io/sprig/date.html"
    10  	sprigDict           = "Sprig Dictionnary, http://masterminds.github.io/sprig/dicst.html"
    11  	sprigEncoding       = "Sprig Encoding, http://masterminds.github.io/sprig/encoding.html"
    12  	sprigFilePath       = "Sprig File Path, http://masterminds.github.io/sprig/paths.html"
    13  	sprigFlow           = "Sprig Flow Control, http://masterminds.github.io/sprig/flow_control.html"
    14  	sprigGen            = "Sprig General, http://masterminds.github.io/sprig/"
    15  	sprigList           = "Sprig List, http://masterminds.github.io/sprig/lists.html"
    16  	sprigMath           = "Sprig Mathematics, http://masterminds.github.io/sprig/math.html"
    17  	sprigRegex          = "Sprig Regex, http://masterminds.github.io/sprig/strings.html"
    18  	sprigSemver         = "Sprig Version comparison, http://masterminds.github.io/sprig/semver.html"
    19  	sprigString         = "Sprig Strings, http://masterminds.github.io/sprig/strings.html"
    20  	sprigReflect        = "Sprig Reflection, http://masterminds.github.io/sprig/reflection.html"
    21  	sprigDefault        = "Sprig Default, http://masterminds.github.io/sprig/defaults.html"
    22  	sprigOS             = "Sprig OS, http://masterminds.github.io/sprig/defaults.html"
    23  	sprigTypeConversion = "Sprig Type Conversion, http://masterminds.github.io/sprig/conversion.html"
    24  	sprigStringList     = "Sprig String Slice, http://masterminds.github.io/sprig/string_slice.html"
    25  )
    26  
    27  var sprigFuncs funcTableMap
    28  
    29  var sprigFuncMap = sprig.GenericFuncMap()
    30  var sprigDef = sprigFuncMap["default"].(func(interface{}, ...interface{}) interface{})
    31  var sprigRound = sprigFuncMap["round"].(func(a interface{}, p int, r_opt ...float64) float64)
    32  
    33  func (t *Template) addSprigFuncs() {
    34  	if sprigFuncs == nil {
    35  		// We get the list of aliases to avoid issuing warning a sprig unmapped functions.
    36  		aliases := make(map[string]string)
    37  		for key, value := range sprigFuncRef {
    38  			for _, alias := range value.aliases {
    39  				aliases[alias] = key
    40  			}
    41  		}
    42  
    43  		sprigFuncs = make(funcTableMap)
    44  		for key, value := range sprigFuncMap {
    45  			info := sprigFuncRef[key]
    46  			if info.group == "" {
    47  				if aliases[key] == "" {
    48  					log.Warning(key, "not found")
    49  					continue
    50  				}
    51  				key = aliases[key]
    52  				info = sprigFuncRef[key]
    53  			}
    54  			sprigFuncs[key] = FuncInfo{function: value, group: info.group, aliases: info.aliases, arguments: info.arguments, description: info.description}
    55  		}
    56  	}
    57  	t.addFunctions(sprigFuncs)
    58  }
    59  
    60  var sprigFuncRef = map[string]struct {
    61  	arguments, aliases []string
    62  	group, description string
    63  }{
    64  	"hello": {group: sprigGen, description: "Simple hello by Sprig"},
    65  	// Date functions
    66  	"date":           {group: sprigDate, description: "The date function formats a dat (https://golang.org/pkg/time/#Time.Format).", arguments: []string{"fmt", "date"}},
    67  	"now":            {group: sprigDate, description: "The current date/time. Use this in conjunction with other date functions."},
    68  	"htmlDate":       {group: sprigDate, description: "The htmlDate function formates a date for inserting into an HTML date picker input field.", arguments: []string{"date"}},
    69  	"htmlDateInZone": {group: sprigDate, description: "Same as htmlDate, but with a timezone.", arguments: []string{"date", "zone"}},
    70  	"dateInZone":     {group: sprigDate, description: "Same as date, but with a timezone.", arguments: []string{"fmt", "date", "zone"}, aliases: []string{"date_in_zone"}},
    71  	"dateModify":     {group: sprigDate, description: "The dateModify takes a modification and a date and returns the timestamp.", arguments: []string{"fmt", "date"}, aliases: []string{"date_modify"}},
    72  	"ago":            {group: sprigDate, description: "The ago function returns duration from time.Now in seconds resolution.", arguments: []string{"date"}},
    73  	"toDate":         {group: sprigDate, description: "Converts a string to a date. The first argument is the date layout and the second the date string. If the string can’t be convert it returns the zero value.", arguments: []string{"fmt", "str"}},
    74  
    75  	// Strings functions
    76  	"abbrev":        {group: sprigString, description: "Truncates a string with ellipses (...).", arguments: []string{"width", "str"}},
    77  	"abbrevboth":    {group: sprigString, description: "Abbreviates both sides with ellipses (...).", arguments: []string{"left", "right", "str"}},
    78  	"camelcase":     {group: sprigString, description: "Converts string from snake_case to CamelCase.", arguments: []string{"str"}},
    79  	"cat":           {group: sprigString, description: "Concatenates multiple strings together into one, separating them with spaces."},
    80  	"containsSprig": {group: sprigString, description: "Tests to see if one string is contained inside of another.", arguments: []string{"substr", "str"}, aliases: []string{"contains"}},
    81  	"hasPrefix":     {group: sprigString, description: "Tests whether a string has a given prefix.", arguments: []string{"prefix", "str"}},
    82  	"hasSuffix":     {group: sprigString, description: "Tests whether a string has a given suffix.", arguments: []string{"suffix", "str"}},
    83  	"indentSprig":   {group: sprigString, description: "Indents every line in a given string to the specified indent width. This is useful when aligning multi-line strings.", arguments: []string{"spaces", "str"}, aliases: []string{"indent"}},
    84  	"initials":      {group: sprigString, description: "Given multiple words, takes the first letter of each word and combine.", arguments: []string{"str"}},
    85  	"kebabcase":     {group: sprigString, description: "Convert string from camelCase to kebab-case.", arguments: []string{"str"}},
    86  	"lower":         {group: sprigString, description: "Converts the entire string to lowercase.", arguments: []string{"str"}},
    87  	"nindentSprig":  {group: sprigString, description: "Same as the indent function, but prepends a new line to the beginning of the string.", arguments: []string{"spaces", "str"}, aliases: []string{"nindent"}},
    88  	"nospace":       {group: sprigString, description: "Removes all whitespace from a string.", arguments: []string{"str"}},
    89  	"plural":        {group: sprigString, description: "Pluralizes a string.", arguments: []string{"one", "many", "count"}},
    90  	"quote":         {group: sprigString, description: "Wraps each argument with double quotes.", arguments: []string{"str"}},
    91  	"randAlpha":     {group: sprigString, description: "Generates random string with letters.", arguments: []string{"count"}},
    92  	"randAlphaNum":  {group: sprigString, description: "Generates random string with letters and digits.", arguments: []string{"count"}},
    93  	"randAscii":     {group: sprigString, description: "Generates random string with ASCII printable characters.", arguments: []string{"count"}},
    94  	"randNumeric":   {group: sprigString, description: "Generates random string with digits.", arguments: []string{"count"}},
    95  	"repeatSprig":   {group: sprigString, description: "Repeats a string multiple times.", arguments: []string{"count", "str"}, aliases: []string{"repeat"}},
    96  	"replace":       {group: sprigString, description: "Performs simple string replacement.", arguments: []string{"old", "new", "src"}},
    97  	"shuffle":       {group: sprigString, description: "Shuffle a string.", arguments: []string{"str"}},
    98  	"snakecase":     {group: sprigString, description: "Converts string from camelCase to snake_case.", arguments: []string{"str"}},
    99  	"squote":        {group: sprigString, description: "Wraps each argument with single quotes."},
   100  	"substr":        {group: sprigString, description: "Get a substring from a string.", arguments: []string{"start", "length", "str"}},
   101  	"swapcase":      {group: sprigString, description: "Swaps the uppercase to lowercase and lowercase to uppercase.", arguments: []string{"str"}},
   102  	"title":         {group: sprigString, description: "Converts to title case.", arguments: []string{"str"}},
   103  	"toString":      {group: sprigString, description: "Converts any value to string.", arguments: []string{"value"}},
   104  	"trim":          {group: sprigString, description: "Removes space from either side of a string.", arguments: []string{"str"}},
   105  	"trimAll":       {group: sprigString, description: "Removes given characters from the front or back of a string.", aliases: []string{"trimall"}, arguments: []string{"chars", "str"}},
   106  	"trimPrefix":    {group: sprigString, description: "Trims just the prefix from a string if present.", arguments: []string{"prefix", "str"}},
   107  	"trimSuffix":    {group: sprigString, description: "Trims just the suffix from a string if present.", arguments: []string{"suffix", "str"}},
   108  	"truncSprig":    {group: sprigString, description: "Truncates a string (and add no suffix).", arguments: []string{"length", "str"}, aliases: []string{"trunc"}},
   109  	"untitle":       {group: sprigString, description: `Removes title casing.`, arguments: []string{"str"}},
   110  	"upper":         {group: sprigString, description: "Converts the entire string to uppercase.", arguments: []string{"str"}},
   111  	"wrapSprig":     {group: sprigString, description: "Wraps text at a given column count.", arguments: []string{"length", "str"}, aliases: []string{"wrap"}},
   112  	"wrapWith":      {group: sprigString, description: "Works as wrap, but lets you specify the string to wrap with (wrap uses \\n).", arguments: []string{"length", "spe", "str"}},
   113  
   114  	"atoi":     {group: sprigTypeConversion},
   115  	"int64":    {group: sprigTypeConversion},
   116  	"intSprig": {group: sprigTypeConversion, aliases: []string{"int"}},
   117  	"float64":  {group: sprigTypeConversion},
   118  
   119  	"split":     {group: sprigStringList},
   120  	"splitn":    {group: sprigStringList},
   121  	"splitList": {group: sprigStringList},
   122  	"toStrings": {group: sprigStringList},
   123  	"join":      {group: sprigStringList},
   124  	"sortAlpha": {group: sprigStringList},
   125  
   126  	// VERY basic arithmetic.
   127  	"add1":       {group: sprigMath},
   128  	"addSprig":   {group: sprigMath, aliases: []string{"add"}},
   129  	"subSprig":   {group: sprigMath, aliases: []string{"sub"}},
   130  	"divSprig":   {group: sprigMath, aliases: []string{"div"}},
   131  	"modSprig":   {group: sprigMath, aliases: []string{"mod"}},
   132  	"mulSprig":   {group: sprigMath, aliases: []string{"mul"}},
   133  	"maxSprig":   {group: sprigMath, aliases: []string{"max", "biggest", "biggestSprig"}},
   134  	"minSprig":   {group: sprigMath, aliases: []string{"min"}},
   135  	"ceilSprig":  {group: sprigMath, aliases: []string{"ceil"}},
   136  	"floorSprig": {group: sprigMath, aliases: []string{"floor"}},
   137  	"round":      {group: sprigMath},
   138  
   139  	"until":     {group: sprigMath, aliases: []string{"until"}},
   140  	"untilStep": {group: sprigMath},
   141  
   142  	// Defaults
   143  	"default":           {group: sprigDefault},
   144  	"empty":             {group: sprigDefault},
   145  	"coalesce":          {group: sprigDefault},
   146  	"compact":           {group: sprigDefault},
   147  	"toJsonSprig":       {group: sprigDefault, aliases: []string{"toJson"}},
   148  	"toPrettyJsonSprig": {group: sprigDefault, aliases: []string{"toPrettyJson"}},
   149  	"ternarySprig":      {group: sprigDefault, aliases: []string{"ternary"}},
   150  
   151  	// Reflection
   152  	"typeOf":     {group: sprigReflect, aliases: []string{"typeof"}},
   153  	"typeIs":     {group: sprigReflect, aliases: []string{"typeis"}},
   154  	"typeIsLike": {group: sprigReflect, aliases: []string{"typeisLike"}},
   155  	"kindOf":     {group: sprigReflect, aliases: []string{"kindof"}},
   156  	"kindIs":     {group: sprigReflect, aliases: []string{"kindis"}},
   157  
   158  	// OS:
   159  	"env":       {group: sprigOS},
   160  	"expandenv": {group: sprigOS},
   161  
   162  	// File Paths:
   163  	"base":  {group: sprigFilePath},
   164  	"dir":   {group: sprigFilePath},
   165  	"clean": {group: sprigFilePath},
   166  	"ext":   {group: sprigFilePath},
   167  	"isAbs": {group: sprigFilePath},
   168  
   169  	// Encoding:
   170  	"b64enc": {group: sprigEncoding},
   171  	"b64dec": {group: sprigEncoding},
   172  	"b32enc": {group: sprigEncoding},
   173  	"b32dec": {group: sprigEncoding},
   174  
   175  	// Data Structures:
   176  	"listSprig":      {group: sprigDict, aliases: []string{"list", "tuple", "tupleSprig"}},
   177  	"dictSprig":      {group: sprigDict, aliases: []string{"dict"}},
   178  	"setSprig":       {group: sprigDict, aliases: []string{"set"}},
   179  	"unsetSprig":     {group: sprigDict, aliases: []string{"unset"}},
   180  	"hasKeySprig":    {group: sprigDict, aliases: []string{"hasKey"}},
   181  	"pluckSprig":     {group: sprigDict, aliases: []string{"pluck"}},
   182  	"keysSprig":      {group: sprigDict, aliases: []string{"keys"}},
   183  	"pickSprig":      {group: sprigDict, aliases: []string{"pick"}},
   184  	"omitSprig":      {group: sprigDict, aliases: []string{"omit"}},
   185  	"mergeSprig":     {group: sprigDict, aliases: []string{"merge"}},
   186  	"mergeOverwrite": {group: sprigDict, description: "Merge two or more dictionaries into one, giving precedence from **right to left**, effectively overwriting values in the dest dictionary"},
   187  	"valuesSprig":    {group: sprigDict, aliases: []string{"values"}},
   188  
   189  	// Lists functions
   190  	"appendSprig":  {group: sprigList, aliases: []string{"append", "push", "pushSprig"}},
   191  	"prependSprig": {group: sprigList, aliases: []string{"prepend"}},
   192  	"first":        {group: sprigList},
   193  	"restSprig":    {group: sprigList, aliases: []string{"rest"}},
   194  	"last":         {group: sprigList},
   195  	"initialSprig": {group: sprigList, aliases: []string{"initial"}},
   196  	"reverseSprig": {group: sprigList, aliases: []string{"reverse"}},
   197  	"uniqSprig":    {group: sprigList, aliases: []string{"uniq"}},
   198  	"withoutSprig": {group: sprigList, aliases: []string{"without"}},
   199  	"hasSprig":     {group: sprigList, aliases: []string{"has"}},
   200  	"sliceSprig":   {group: sprigList, aliases: []string{"slice"}},
   201  
   202  	// Cryptographics functions
   203  	"adler32sum":        {group: sprigCrypto, description: "Computes Adler-32 checksum.", arguments: []string{"input"}},
   204  	"sha1sum":           {group: sprigCrypto, description: "Computes SHA1 digest.", arguments: []string{"input"}},
   205  	"sha256sum":         {group: sprigCrypto, description: "Computes SHA256 digest.", arguments: []string{"input"}},
   206  	"genPrivateKey":     {group: sprigCrypto, description: "Generates a new private key encoded into a PEM block. Type should be: ecdsa, dsa or rsa", arguments: []string{"type"}},
   207  	"derivePassword":    {group: sprigCrypto},
   208  	"buildCustomCert":   {group: sprigCrypto},
   209  	"genCA":             {group: sprigCrypto},
   210  	"genSelfSignedCert": {group: sprigCrypto},
   211  	"genSignedCert":     {group: sprigCrypto},
   212  
   213  	// UUIDs:
   214  	"uuidv4": {group: sprigGen, aliases: []string{"uuid", "guid", "GUID"}},
   215  
   216  	// SemVer:
   217  	"semver":        {group: sprigSemver, description: "Parses a string into a Semantic Version.", arguments: []string{"version"}},
   218  	"semverCompare": {group: sprigSemver, description: "A more robust comparison function is provided as semverCompare. This version supports version ranges.", arguments: []string{"constraints", "version"}},
   219  
   220  	// Flow Control:
   221  	"fail": {group: sprigFlow, description: "Unconditionally returns an empty string and an error with the specified text. This is useful in scenarios where other conditionals have determined that template rendering should fail."},
   222  
   223  	// Regex
   224  	"regexMatch":             {group: sprigRegex, description: "Returns true if the input string matches the regular expression.", arguments: []string{"regex", "str"}},
   225  	"regexFindAll":           {group: sprigRegex, description: "Returns a slice of all matches of the regular expression in the input string.", arguments: []string{"regex", "str", "n"}},
   226  	"regexFind":              {group: sprigRegex, description: "Returns the first (left most) match of the regular expression in the input string.", arguments: []string{"regex", "str"}},
   227  	"regexReplaceAll":        {group: sprigRegex, description: "Returns a copy of the input string, replacing matches of the Regexp with the replacement string replacement. Inside string replacement, $ signs are interpreted as in Expand, so for instance $1 represents the text of the first submatch.", arguments: []string{"regex", "str", "repl"}},
   228  	"regexReplaceAllLiteral": {group: sprigRegex, description: "Returns a copy of the input string, replacing matches of the Regexp with the replacement string replacement The replacement string is substituted directly, without using Expand.", arguments: []string{"regex", "str", "repl"}},
   229  	"regexSplit":             {group: sprigRegex, description: "Slices the input string into substrings separated by the expression and returns a slice of the substrings between those expression matches. The last parameter n determines the number of substrings to return, where -1 means return all matches.", arguments: []string{"regex", "str", "n"}},
   230  }