// Copyright © 2016 Abcum Ltd // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package fncs import ( "context" "fmt" "strings" "github.com/abcum/surreal/util/ints" "github.com/abcum/surreal/util/text" ) func stringConcat(ctx context.Context, args ...interface{}) (str string, err error) { for _, v := range args { str = str + fmt.Sprint(v) } return } func stringContains(ctx context.Context, args ...interface{}) (bool, error) { s, _ := ensureString(args[0]) p, _ := ensureString(args[1]) return strings.Contains(s, p), nil } func stringEndsWith(ctx context.Context, args ...interface{}) (bool, error) { s, _ := ensureString(args[0]) p, _ := ensureString(args[1]) return strings.HasSuffix(s, p), nil } func stringFormat(ctx context.Context, args ...interface{}) (str string, err error) { switch len(args) { case 0, 1: // Not enough arguments, so just ignore default: s, _ := ensureString(args[0]) str = fmt.Sprintf(s, args[1:]...) } return } func stringIncludes(ctx context.Context, args ...interface{}) (bool, error) { s, _ := ensureString(args[0]) p, _ := ensureString(args[1]) return strings.Contains(s, p), nil } func stringJoin(ctx context.Context, args ...interface{}) (str string, err error) { switch len(args) { case 0, 1: // Not enough arguments, so just ignore default: var a []string j, _ := ensureString(args[0]) for _, v := range args[1:] { if v != nil { a = append(a, fmt.Sprint(v)) } } str = strings.Join(a, j) } return } func stringLength(ctx context.Context, args ...interface{}) (float64, error) { s, _ := ensureString(args[0]) return float64(len(s)), nil } func stringLevenshtein(ctx context.Context, args ...interface{}) (float64, error) { s, _ := ensureString(args[0]) c, _ := ensureString(args[1]) return float64(text.Levenshtein(s, c)), nil } func stringLowercase(ctx context.Context, args ...interface{}) (string, error) { s, _ := ensureString(args[0]) return strings.ToLower(s), nil } func stringRepeat(ctx context.Context, args ...interface{}) (string, error) { s, _ := ensureString(args[0]) if c, ok := ensureInt(args[1]); ok { return strings.Repeat(s, int(c)), nil } return s, nil } func stringReplace(ctx context.Context, args ...interface{}) (string, error) { s, _ := ensureString(args[0]) o, _ := ensureString(args[1]) n, _ := ensureString(args[2]) return strings.Replace(s, o, n, -1), nil } func stringReverse(ctx context.Context, args ...interface{}) (string, error) { s, _ := ensureString(args[0]) r := []rune(s) for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 { r[i], r[j] = r[j], r[i] } return string(r), nil } func stringSearch(ctx context.Context, args ...interface{}) (float64, error) { s, _ := ensureString(args[0]) p, _ := ensureString(args[1]) return float64(strings.Index(s, p)), nil } func stringSlice(ctx context.Context, args ...interface{}) (string, error) { s, _ := ensureString(args[0]) b, bk := ensureInt(args[1]) e, ek := ensureInt(args[2]) f := ints.Min(len(s), int(b+e)) if bk && ek { return s[b:f], nil } else if bk { return s[b:], nil } else if ek { return s[:f], nil } return s, nil } func stringSplit(ctx context.Context, args ...interface{}) ([]string, error) { s, _ := ensureString(args[0]) p, _ := ensureString(args[1]) return strings.Split(s, p), nil } func stringStartsWith(ctx context.Context, args ...interface{}) (bool, error) { s, _ := ensureString(args[0]) p, _ := ensureString(args[1]) return strings.HasPrefix(s, p), nil } func stringSubstr(ctx context.Context, args ...interface{}) (string, error) { s, _ := ensureString(args[0]) b, bk := ensureInt(args[1]) e, ek := ensureInt(args[2]) f := ints.Min(len(s), int(e)) if bk && ek { return s[b:f], nil } else if bk { return s[b:], nil } else if ek { return s[:f], nil } return s, nil } func stringTrim(ctx context.Context, args ...interface{}) (string, error) { s, _ := ensureString(args[0]) return strings.TrimSpace(s), nil } func stringUppercase(ctx context.Context, args ...interface{}) (string, error) { s, _ := ensureString(args[0]) return strings.ToUpper(s), nil } func stringWords(ctx context.Context, args ...interface{}) ([]string, error) { s, _ := ensureString(args[0]) return strings.Fields(s), nil }