Replaced fmt, strings, sort, os, io, sync, encoding/json, path/filepath, errors, log, reflect with core.Sprintf, core.E, core.Contains, core.Trim, core.Split, core.Join, core.JoinPath, slices.Sort, c.Fs(), c.Lock(), core.JSONMarshal, core.ReadAll and other CoreGO v0.8.0 primitives. Framework boundary exceptions preserved where stdlib types are required by external interfaces (Gin, net/http, CGo, Wails, bubbletea). Co-Authored-By: Virgil <virgil@lethean.io>
57 lines
1.1 KiB
Go
57 lines
1.1 KiB
Go
// SPDX-License-Identifier: EUPL-1.2
|
|
|
|
package api
|
|
|
|
import (
|
|
"strings"
|
|
|
|
core "dappco.re/go/core"
|
|
)
|
|
|
|
// normaliseServers trims whitespace, removes empty entries, and preserves
|
|
// the first occurrence of each server URL.
|
|
func normaliseServers(servers []string) []string {
|
|
if len(servers) == 0 {
|
|
return nil
|
|
}
|
|
|
|
cleaned := make([]string, 0, len(servers))
|
|
seen := make(map[string]struct{}, len(servers))
|
|
|
|
for _, server := range servers {
|
|
server = normaliseServer(server)
|
|
if server == "" {
|
|
continue
|
|
}
|
|
if _, ok := seen[server]; ok {
|
|
continue
|
|
}
|
|
seen[server] = struct{}{}
|
|
cleaned = append(cleaned, server)
|
|
}
|
|
|
|
if len(cleaned) == 0 {
|
|
return nil
|
|
}
|
|
|
|
return cleaned
|
|
}
|
|
|
|
// normaliseServer trims surrounding whitespace and removes a trailing slash
|
|
// from non-root server URLs so equivalent metadata collapses to one entry.
|
|
func normaliseServer(server string) string {
|
|
server = core.Trim(server)
|
|
if server == "" {
|
|
return ""
|
|
}
|
|
if server == "/" {
|
|
return server
|
|
}
|
|
|
|
server = strings.TrimRight(server, "/")
|
|
if server == "" {
|
|
return "/"
|
|
}
|
|
|
|
return server
|
|
}
|