internal/platform/strutil/strutil.go (79 lines of code) (raw):
/*
* Copyright 2021-2024 JetBrains s.r.o.
*
* 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
*
* https://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 strutil
import (
"runtime"
"strings"
)
// SafeSplit splits a string by a separator and safely returns the element at the given index.
// If the index is out of range, an empty string is returned.
func SafeSplit(s string, sep string, index int) string {
parts := strings.Split(s, sep)
if index >= 0 && index < len(parts) {
return parts[index]
}
return ""
}
// Lower is a shortcut to strings.ToLower.
func Lower(s string) string {
return strings.ToLower(s)
}
// Contains checks if a string is in a given slice.
func Contains(s []string, str string) bool {
for _, v := range s {
if v == str {
return true
}
}
return false
}
// Append appends a string to a slice if it's not already there.
func Append(slice []string, elems ...string) []string {
if !Contains(slice, elems[0]) {
slice = append(slice, elems[0])
}
return slice
}
// Remove removes a string from a slice.
func Remove(s []string, r string) []string {
for i, v := range s {
if v == r {
return append(s[:i], s[i+1:]...)
}
}
return s
}
// QuoteIfSpace wraps in '"' if the string contains a space.
func QuoteIfSpace(s string) string {
if IsStringQuoted(s) {
return s
}
if strings.Contains(s, " ") {
return "\"" + s + "\""
}
return s
}
// QuoteForWindows wraps s in quotes if s contains a typical Windows batch special char and isn't yet quoted.
func QuoteForWindows(s string) string {
if IsStringQuoted(s) {
return s
}
if runtime.GOOS == "windows" && ContainsWinSpecialChar(s) {
return `"` + s + `"`
}
return s
}
// GetQuotedPath returns a quoted path for the current OS.
func GetQuotedPath(path string) string {
if runtime.GOOS == "windows" {
return QuoteForWindows(path)
}
return QuoteIfSpace(path)
}
// IsStringQuoted checks if a string is already quoted with double quotes.
func IsStringQuoted(s string) bool {
return strings.HasPrefix(s, "\"") && strings.HasSuffix(s, "\"")
}
// ContainsWinSpecialChar returns true if s contains any common Windows batch special char that requires quoting.
func ContainsWinSpecialChar(s string) bool {
specialChars := []string{" ", "(", ")", "^", "&", "|", "<", ">"}
for _, c := range specialChars {
if strings.Contains(s, c) {
return true
}
}
return false
}
// Reverse reverses the given string slice.
func Reverse(s []string) []string {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
return s
}