const defaultLocale … const defaultPrecision … // Strings returns a cel.EnvOption to configure extended functions for string manipulation. // As a general note, all indices are zero-based. // // # CharAt // // Returns the character at the given position. If the position is negative, or greater than // the length of the string, the function will produce an error: // // <string>.charAt(<int>) -> <string> // // Examples: // // 'hello'.charAt(4) // return 'o' // 'hello'.charAt(5) // return '' // 'hello'.charAt(-1) // error // // # Format // // Introduced at version: 1 // // Returns a new string with substitutions being performed, printf-style. // The valid formatting clauses are: // // `%s` - substitutes a string. This can also be used on bools, lists, maps, bytes, // Duration and Timestamp, in addition to all numerical types (int, uint, and double). // Note that the dot/period decimal separator will always be used when printing a list // or map that contains a double, and that null can be passed (which results in the // string "null") in addition to types. // `%d` - substitutes an integer. // `%f` - substitutes a double with fixed-point precision. The default precision is 6, but // this can be adjusted. The strings `Infinity`, `-Infinity`, and `NaN` are also valid input // for this clause. // `%e` - substitutes a double in scientific notation. The default precision is 6, but this // can be adjusted. // `%b` - substitutes an integer with its equivalent binary string. Can also be used on bools. // `%x` - substitutes an integer with its equivalent in hexadecimal, or if given a string or // bytes, will output each character's equivalent in hexadecimal. // `%X` - same as above, but with A-F capitalized. // `%o` - substitutes an integer with its equivalent in octal. // // <string>.format(<list>) -> <string> // // Examples: // // "this is a string: %s\nand an integer: %d".format(["str", 42]) // returns "this is a string: str\nand an integer: 42" // "a double substituted with %%s: %s".format([64.2]) // returns "a double substituted with %s: 64.2" // "string type: %s".format([type(string)]) // returns "string type: string" // "timestamp: %s".format([timestamp("2023-02-03T23:31:20+00:00")]) // returns "timestamp: 2023-02-03T23:31:20Z" // "duration: %s".format([duration("1h45m47s")]) // returns "duration: 6347s" // "%f".format([3.14]) // returns "3.140000" // "scientific notation: %e".format([2.71828]) // returns "scientific notation: 2.718280\u202f\u00d7\u202f10\u2070\u2070" // "5 in binary: %b".format([5]), // returns "5 in binary; 101" // "26 in hex: %x".format([26]), // returns "26 in hex: 1a" // "26 in hex (uppercase): %X".format([26]) // returns "26 in hex (uppercase): 1A" // "30 in octal: %o".format([30]) // returns "30 in octal: 36" // "a map inside a list: %s".format([[1, 2, 3, {"a": "x", "b": "y", "c": "z"}]]) // returns "a map inside a list: [1, 2, 3, {"a":"x", "b":"y", "c":"d"}]" // "true bool: %s - false bool: %s\nbinary bool: %b".format([true, false, true]) // returns "true bool: true - false bool: false\nbinary bool: 1" // // Passing an incorrect type (a string to `%b`) is considered an error, as well as attempting // to use more formatting clauses than there are arguments (`%d %d %d` while passing two ints, for instance). // If compile-time checking is enabled, and the formatting string is a constant, and the argument list is a literal, // then letting any arguments go unused/unformatted is also considered an error. // // # IndexOf // // Returns the integer index of the first occurrence of the search string. If the search string is // not found the function returns -1. // // The function also accepts an optional position from which to begin the substring search. If the // substring is the empty string, the index where the search starts is returned (zero or custom). // // <string>.indexOf(<string>) -> <int> // <string>.indexOf(<string>, <int>) -> <int> // // Examples: // // 'hello mellow'.indexOf('') // returns 0 // 'hello mellow'.indexOf('ello') // returns 1 // 'hello mellow'.indexOf('jello') // returns -1 // 'hello mellow'.indexOf('', 2) // returns 2 // 'hello mellow'.indexOf('ello', 2) // returns 7 // 'hello mellow'.indexOf('ello', 20) // error // // # Join // // Returns a new string where the elements of string list are concatenated. // // The function also accepts an optional separator which is placed between elements in the resulting string. // // <list<string>>.join() -> <string> // <list<string>>.join(<string>) -> <string> // // Examples: // // ['hello', 'mellow'].join() // returns 'hellomellow' // ['hello', 'mellow'].join(' ') // returns 'hello mellow' // [].join() // returns '' // [].join('/') // returns '' // // # LastIndexOf // // Returns the integer index at the start of the last occurrence of the search string. If the // search string is not found the function returns -1. // // The function also accepts an optional position which represents the last index to be // considered as the beginning of the substring match. If the substring is the empty string, // the index where the search starts is returned (string length or custom). // // <string>.lastIndexOf(<string>) -> <int> // <string>.lastIndexOf(<string>, <int>) -> <int> // // Examples: // // 'hello mellow'.lastIndexOf('') // returns 12 // 'hello mellow'.lastIndexOf('ello') // returns 7 // 'hello mellow'.lastIndexOf('jello') // returns -1 // 'hello mellow'.lastIndexOf('ello', 6) // returns 1 // 'hello mellow'.lastIndexOf('ello', -1) // error // // # LowerAscii // // Returns a new string where all ASCII characters are lower-cased. // // This function does not perform Unicode case-mapping for characters outside the ASCII range. // // <string>.lowerAscii() -> <string> // // Examples: // // 'TacoCat'.lowerAscii() // returns 'tacocat' // 'TacoCÆt Xii'.lowerAscii() // returns 'tacocÆt xii' // // # Strings.Quote // // Introduced in version: 1 // // Takes the given string and makes it safe to print (without any formatting due to escape sequences). // If any invalid UTF-8 characters are encountered, they are replaced with \uFFFD. // // strings.quote(<string>) // // Examples: // // strings.quote('single-quote with "double quote"') // returns '"single-quote with \"double quote\""' // strings.quote("two escape sequences \a\n") // returns '"two escape sequences \\a\\n"' // // # Replace // // Returns a new string based on the target, which replaces the occurrences of a search string // with a replacement string if present. The function accepts an optional limit on the number of // substring replacements to be made. // // When the replacement limit is 0, the result is the original string. When the limit is a negative // number, the function behaves the same as replace all. // // <string>.replace(<string>, <string>) -> <string> // <string>.replace(<string>, <string>, <int>) -> <string> // // Examples: // // 'hello hello'.replace('he', 'we') // returns 'wello wello' // 'hello hello'.replace('he', 'we', -1) // returns 'wello wello' // 'hello hello'.replace('he', 'we', 1) // returns 'wello hello' // 'hello hello'.replace('he', 'we', 0) // returns 'hello hello' // 'hello hello'.replace('', '_') // returns '_h_e_l_l_o_ _h_e_l_l_o_' // 'hello hello'.replace('h', '') // returns 'ello ello' // // # Split // // Returns a list of strings split from the input by the given separator. The function accepts // an optional argument specifying a limit on the number of substrings produced by the split. // // When the split limit is 0, the result is an empty list. When the limit is 1, the result is the // target string to split. When the limit is a negative number, the function behaves the same as // split all. // // <string>.split(<string>) -> <list<string>> // <string>.split(<string>, <int>) -> <list<string>> // // Examples: // // 'hello hello hello'.split(' ') // returns ['hello', 'hello', 'hello'] // 'hello hello hello'.split(' ', 0) // returns [] // 'hello hello hello'.split(' ', 1) // returns ['hello hello hello'] // 'hello hello hello'.split(' ', 2) // returns ['hello', 'hello hello'] // 'hello hello hello'.split(' ', -1) // returns ['hello', 'hello', 'hello'] // // # Substring // // Returns the substring given a numeric range corresponding to character positions. Optionally // may omit the trailing range for a substring from a given character position until the end of // a string. // // Character offsets are 0-based with an inclusive start range and exclusive end range. It is an // error to specify an end range that is lower than the start range, or for either the start or end // index to be negative or exceed the string length. // // <string>.substring(<int>) -> <string> // <string>.substring(<int>, <int>) -> <string> // // Examples: // // 'tacocat'.substring(4) // returns 'cat' // 'tacocat'.substring(0, 4) // returns 'taco' // 'tacocat'.substring(-1) // error // 'tacocat'.substring(2, 1) // error // // # Trim // // Returns a new string which removes the leading and trailing whitespace in the target string. // The trim function uses the Unicode definition of whitespace which does not include the // zero-width spaces. See: https://en.wikipedia.org/wiki/Whitespace_character#Unicode // // <string>.trim() -> <string> // // Examples: // // ' \ttrim\n '.trim() // returns 'trim' // // # UpperAscii // // Returns a new string where all ASCII characters are upper-cased. // // This function does not perform Unicode case-mapping for characters outside the ASCII range. // // <string>.upperAscii() -> <string> // // Examples: // // 'TacoCat'.upperAscii() // returns 'TACOCAT' // 'TacoCÆt Xii'.upperAscii() // returns 'TACOCÆT XII' // // # Reverse // // Introduced at version: 3 // // Returns a new string whose characters are the same as the target string, only formatted in // reverse order. // This function relies on converting strings to rune arrays in order to reverse // // <string>.reverse() -> <string> // // Examples: // // 'gums'.reverse() // returns 'smug' // 'John Smith'.reverse() // returns 'htimS nhoJ' func Strings(options ...StringsOption) cel.EnvOption { … } type stringLib … // LibraryName implements the SingletonLibrary interface method. func (*stringLib) LibraryName() string { … } type StringsOption … // StringsLocale configures the library with the given locale. The locale tag will // be checked for validity at the time that EnvOptions are configured. If this option // is not passed, string.format will behave as if en_US was passed as the locale. func StringsLocale(locale string) StringsOption { … } // StringsVersion configures the version of the string library. // // The version limits which functions are available. Only functions introduced // below or equal to the given version included in the library. If this option // is not set, all functions are available. // // See the library documentation to determine which version a function was introduced. // If the documentation does not state which version a function was introduced, it can // be assumed to be introduced at version 0, when the library was first created. func StringsVersion(version uint32) StringsOption { … } // StringsValidateFormatCalls validates type-checked ASTs to ensure that string.format() calls have // valid formatting clauses and valid argument types for each clause. // // Enabled by default. func StringsValidateFormatCalls(value bool) StringsOption { … } // CompileOptions implements the Library interface method. func (lib *stringLib) CompileOptions() []cel.EnvOption { … } // ProgramOptions implements the Library interface method. func (*stringLib) ProgramOptions() []cel.ProgramOption { … } func charAt(str string, ind int64) (string, error) { … } func indexOf(str, substr string) (int64, error) { … } func indexOfOffset(str, substr string, offset int64) (int64, error) { … } func lastIndexOf(str, substr string) (int64, error) { … } func lastIndexOfOffset(str, substr string, offset int64) (int64, error) { … } func lowerASCII(str string) (string, error) { … } func replace(str, old, new string) (string, error) { … } func replaceN(str, old, new string, n int64) (string, error) { … } func split(str, sep string) ([]string, error) { … } func splitN(str, sep string, n int64) ([]string, error) { … } func substr(str string, start int64) (string, error) { … } func substrRange(str string, start, end int64) (string, error) { … } func trimSpace(str string) (string, error) { … } func upperASCII(str string) (string, error) { … } func reverse(str string) (string, error) { … } func joinSeparator(strs []string, separator string) (string, error) { … } func join(strs []string) (string, error) { … } func joinValSeparator(strs traits.Lister, separator string) (string, error) { … } // quote implements a string quoting function. The string will be wrapped in // double quotes, and all valid CEL escape sequences will be escaped to show up // literally if printed. If the input contains any invalid UTF-8, the invalid runes // will be replaced with utf8.RuneError. func quote(s string) (string, error) { … } // sanitize replaces all invalid runes in the given string with utf8.RuneError. func sanitize(s string) string { … } var stringListType …