113 lines
2.0 KiB
Go
113 lines
2.0 KiB
Go
|
|
package rest
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"os"
|
||
|
|
"regexp"
|
||
|
|
"sort"
|
||
|
|
"strings"
|
||
|
|
)
|
||
|
|
|
||
|
|
func firstRegexMatch(pattern *regexp.Regexp, value string) string {
|
||
|
|
match := pattern.FindString(value)
|
||
|
|
return strings.TrimSpace(match)
|
||
|
|
}
|
||
|
|
|
||
|
|
func compactStringMap(values map[string]string) map[string]string {
|
||
|
|
if len(values) == 0 {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
out := map[string]string{}
|
||
|
|
for key, value := range values {
|
||
|
|
if trimmed := strings.TrimSpace(value); trimmed != "" {
|
||
|
|
out[key] = trimmed
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if len(out) == 0 {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
return out
|
||
|
|
}
|
||
|
|
|
||
|
|
func compactAnyMap(values map[string]any) map[string]any {
|
||
|
|
out := map[string]any{}
|
||
|
|
for key, value := range values {
|
||
|
|
if value == nil {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
switch typed := value.(type) {
|
||
|
|
case string:
|
||
|
|
if strings.TrimSpace(typed) == "" {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
case []string:
|
||
|
|
if len(typed) == 0 {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
case []any:
|
||
|
|
if len(typed) == 0 {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
}
|
||
|
|
out[key] = value
|
||
|
|
}
|
||
|
|
return out
|
||
|
|
}
|
||
|
|
|
||
|
|
func stringValue(value any) string {
|
||
|
|
switch typed := value.(type) {
|
||
|
|
case string:
|
||
|
|
return typed
|
||
|
|
case fmt.Stringer:
|
||
|
|
return typed.String()
|
||
|
|
default:
|
||
|
|
return fmt.Sprintf("%v", value)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func stringSliceValue(value any) []string {
|
||
|
|
switch typed := value.(type) {
|
||
|
|
case []string:
|
||
|
|
return typed
|
||
|
|
case []any:
|
||
|
|
out := make([]string, 0, len(typed))
|
||
|
|
for _, item := range typed {
|
||
|
|
out = append(out, stringValue(item))
|
||
|
|
}
|
||
|
|
return out
|
||
|
|
default:
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func uniqueStrings(values []string) []string {
|
||
|
|
seen := map[string]bool{}
|
||
|
|
out := []string{}
|
||
|
|
for _, value := range values {
|
||
|
|
trimmed := strings.TrimSpace(value)
|
||
|
|
if trimmed == "" || seen[trimmed] {
|
||
|
|
continue
|
||
|
|
}
|
||
|
|
seen[trimmed] = true
|
||
|
|
out = append(out, trimmed)
|
||
|
|
}
|
||
|
|
sort.Strings(out)
|
||
|
|
return out
|
||
|
|
}
|
||
|
|
|
||
|
|
func clipString(value string, limit int) string {
|
||
|
|
value = strings.TrimSpace(value)
|
||
|
|
if limit <= 0 || len(value) <= limit {
|
||
|
|
return value
|
||
|
|
}
|
||
|
|
return strings.TrimSpace(value[:limit]) + "..."
|
||
|
|
}
|
||
|
|
|
||
|
|
func fileExists(path string) bool {
|
||
|
|
if path == "" {
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
info, err := os.Stat(path)
|
||
|
|
return err == nil && info != nil
|
||
|
|
}
|