1
0
Fork 0
golang-github-nicholas-fedo.../pkg/format/urlpart.go
Daniel Baumann c0c4addb85
Adding upstream version 0.8.9.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-22 10:16:14 +02:00

84 lines
1.8 KiB
Go

//go:generate stringer -type=URLPart -trimprefix URL
package format
import (
"log"
"strconv"
"strings"
)
// URLPart is an indicator as to what part of an URL a field is serialized to.
type URLPart int
// Suffix returns the separator between the URLPart and its subsequent part.
func (u URLPart) Suffix() rune {
switch u {
case URLQuery:
return '/'
case URLUser:
return ':'
case URLPassword:
return '@'
case URLHost:
return ':'
case URLPort:
return '/'
case URLPath:
return '/'
default:
return '/'
}
}
// indicator as to what part of an URL a field is serialized to.
const (
URLQuery URLPart = iota
URLUser
URLPassword
URLHost
URLPort
URLPath // Base path; additional paths are URLPath + N
)
// ParseURLPart returns the URLPart that matches the supplied string.
func ParseURLPart(inputString string) URLPart {
lowerString := strings.ToLower(inputString)
switch lowerString {
case "user":
return URLUser
case "pass", "password":
return URLPassword
case "host":
return URLHost
case "port":
return URLPort
case "path", "path1":
return URLPath
case "query", "":
return URLQuery
}
// Handle dynamic path segments (e.g., "path2", "path3", etc.).
if strings.HasPrefix(lowerString, "path") && len(lowerString) > 4 {
if num, err := strconv.Atoi(lowerString[4:]); err == nil && num >= 2 {
return URLPath + URLPart(num-1) // Offset from URLPath; "path2" -> URLPath+1
}
}
log.Printf("invalid URLPart: %s, defaulting to URLQuery", lowerString)
return URLQuery
}
// ParseURLParts returns the URLParts that matches the supplied string.
func ParseURLParts(s string) []URLPart {
rawParts := strings.Split(s, ",")
urlParts := make([]URLPart, len(rawParts))
for i, raw := range rawParts {
urlParts[i] = ParseURLPart(raw)
}
return urlParts
}