Files
renamer/internal/filters/extensions.go
2025-10-29 16:08:46 +08:00

67 lines
1.5 KiB
Go

package filters
import (
"fmt"
"strings"
)
// ParseExtensions converts a raw `|`-delimited extension string into a
// normalized, deduplicated slice. Tokens must be prefixed with a dot.
func ParseExtensions(raw string) ([]string, error) {
if strings.TrimSpace(raw) == "" {
return nil, nil
}
tokens := strings.Split(raw, "|")
seen := make(map[string]struct{}, len(tokens))
result := make([]string, 0, len(tokens))
for _, token := range tokens {
trimmed := strings.TrimSpace(token)
if trimmed == "" {
return nil, fmt.Errorf("extensions string contains empty token")
}
if !strings.HasPrefix(trimmed, ".") {
return nil, fmt.Errorf("extension %q must start with '.'", trimmed)
}
normalized := strings.ToLower(trimmed)
if _, exists := seen[normalized]; exists {
continue
}
seen[normalized] = struct{}{}
result = append(result, normalized)
}
return result, nil
}
// MergeExtensions merges two extension slices, deduplicating case-insensitively.
func MergeExtensions(base, extra []string) []string {
if len(extra) == 0 {
return base
}
seen := make(map[string]struct{}, len(base)+len(extra))
merged := make([]string, 0, len(base)+len(extra))
for _, ext := range base {
lower := strings.ToLower(ext)
if _, exists := seen[lower]; exists {
continue
}
seen[lower] = struct{}{}
merged = append(merged, lower)
}
for _, ext := range extra {
lower := strings.ToLower(ext)
if _, exists := seen[lower]; exists {
continue
}
seen[lower] = struct{}{}
merged = append(merged, lower)
}
return merged
}