summaryrefslogtreecommitdiff
path: root/vendor/github.com/google/cel-go/ext/strings.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/google/cel-go/ext/strings.go')
-rw-r--r--vendor/github.com/google/cel-go/ext/strings.go63
1 files changed, 42 insertions, 21 deletions
diff --git a/vendor/github.com/google/cel-go/ext/strings.go b/vendor/github.com/google/cel-go/ext/strings.go
index 2e590a4..de65421 100644
--- a/vendor/github.com/google/cel-go/ext/strings.go
+++ b/vendor/github.com/google/cel-go/ext/strings.go
@@ -286,10 +286,15 @@ const (
//
// 'gums'.reverse() // returns 'smug'
// 'John Smith'.reverse() // returns 'htimS nhoJ'
+//
+// Introduced at version: 4
+//
+// Formatting updated to adhere to https://github.com/google/cel-spec/blob/master/doc/extensions/strings.md.
+//
+// <string>.format(<list>) -> <string>
func Strings(options ...StringsOption) cel.EnvOption {
s := &stringLib{
- version: math.MaxUint32,
- validateFormat: true,
+ version: math.MaxUint32,
}
for _, o := range options {
s = o(s)
@@ -298,9 +303,8 @@ func Strings(options ...StringsOption) cel.EnvOption {
}
type stringLib struct {
- locale string
- version uint32
- validateFormat bool
+ locale string
+ version uint32
}
// LibraryName implements the SingletonLibrary interface method.
@@ -314,6 +318,8 @@ type StringsOption func(*stringLib) *stringLib
// 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.
+//
+// If StringsVersion is greater than or equal to 4, this option is ignored.
func StringsLocale(locale string) StringsOption {
return func(sl *stringLib) *stringLib {
sl.locale = locale
@@ -340,10 +346,9 @@ 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.
+// Deprecated
func StringsValidateFormatCalls(value bool) StringsOption {
return func(s *stringLib) *stringLib {
- s.validateFormat = value
return s
}
}
@@ -351,7 +356,7 @@ func StringsValidateFormatCalls(value bool) StringsOption {
// CompileOptions implements the Library interface method.
func (lib *stringLib) CompileOptions() []cel.EnvOption {
formatLocale := "en_US"
- if lib.locale != "" {
+ if lib.version < 4 && lib.locale != "" {
// ensure locale is properly-formed if set
_, err := language.Parse(lib.locale)
if err != nil {
@@ -466,21 +471,29 @@ func (lib *stringLib) CompileOptions() []cel.EnvOption {
}))),
}
if lib.version >= 1 {
- opts = append(opts, cel.Function("format",
- cel.MemberOverload("string_format", []*cel.Type{cel.StringType, cel.ListType(cel.DynType)}, cel.StringType,
- cel.FunctionBinding(func(args ...ref.Val) ref.Val {
- s := string(args[0].(types.String))
- formatArgs := args[1].(traits.Lister)
- return stringOrError(parseFormatString(s, &stringFormatter{}, &stringArgList{formatArgs}, formatLocale))
- }))),
+ if lib.version >= 4 {
+ opts = append(opts, cel.Function("format",
+ cel.MemberOverload("string_format", []*cel.Type{cel.StringType, cel.ListType(cel.DynType)}, cel.StringType,
+ cel.FunctionBinding(func(args ...ref.Val) ref.Val {
+ s := string(args[0].(types.String))
+ formatArgs := args[1].(traits.Lister)
+ return stringOrError(parseFormatStringV2(s, &stringFormatterV2{}, &stringArgList{formatArgs}))
+ }))))
+ } else {
+ opts = append(opts, cel.Function("format",
+ cel.MemberOverload("string_format", []*cel.Type{cel.StringType, cel.ListType(cel.DynType)}, cel.StringType,
+ cel.FunctionBinding(func(args ...ref.Val) ref.Val {
+ s := string(args[0].(types.String))
+ formatArgs := args[1].(traits.Lister)
+ return stringOrError(parseFormatString(s, &stringFormatter{}, &stringArgList{formatArgs}, formatLocale))
+ }))))
+ }
+ opts = append(opts,
cel.Function("strings.quote", cel.Overload("strings_quote", []*cel.Type{cel.StringType}, cel.StringType,
cel.UnaryBinding(func(str ref.Val) ref.Val {
s := str.(types.String)
return stringOrError(quote(string(s)))
- }))),
-
- cel.ASTValidators(stringFormatValidator{}))
-
+ }))))
}
if lib.version >= 2 {
opts = append(opts,
@@ -529,8 +542,12 @@ func (lib *stringLib) CompileOptions() []cel.EnvOption {
}))),
)
}
- if lib.validateFormat {
- opts = append(opts, cel.ASTValidators(stringFormatValidator{}))
+ if lib.version >= 1 {
+ if lib.version >= 4 {
+ opts = append(opts, cel.ASTValidators(stringFormatValidatorV2{}))
+ } else {
+ opts = append(opts, cel.ASTValidators(stringFormatValidator{}))
+ }
}
return opts
}
@@ -590,6 +607,10 @@ func lastIndexOf(str, substr string) (int64, error) {
if substr == "" {
return int64(len(runes)), nil
}
+
+ if len(str) < len(substr) {
+ return -1, nil
+ }
return lastIndexOfOffset(str, substr, int64(len(runes)-1))
}