2025-04-23 13:59:51 +12:00
|
|
|
package validate
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
"net/url"
|
|
|
|
"regexp"
|
|
|
|
"strings"
|
|
|
|
"unicode/utf8"
|
|
|
|
|
2025-04-24 08:59:44 +12:00
|
|
|
"github.com/google/uuid"
|
2025-04-23 13:59:51 +12:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
hexadecimalRegex = regexp.MustCompile(`^[0-9a-fA-F]+$`)
|
|
|
|
dnsNameRegex = regexp.MustCompile(`^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$`)
|
|
|
|
)
|
|
|
|
|
|
|
|
func IsURL(urlString string) bool {
|
2025-04-24 08:59:44 +12:00
|
|
|
if len(urlString) == 0 {
|
2025-04-23 13:59:51 +12:00
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
strTemp := urlString
|
2025-04-24 08:59:44 +12:00
|
|
|
if !strings.Contains(urlString, "://") {
|
|
|
|
// support no indicated urlscheme
|
|
|
|
// http:// is appended so url.Parse will succeed
|
2025-04-23 13:59:51 +12:00
|
|
|
strTemp = "http://" + urlString
|
|
|
|
}
|
|
|
|
|
|
|
|
u, err := url.Parse(strTemp)
|
2025-04-24 08:59:44 +12:00
|
|
|
return err == nil && u.Host != ""
|
2025-04-23 13:59:51 +12:00
|
|
|
}
|
|
|
|
|
|
|
|
func IsUUID(uuidString string) bool {
|
2025-04-24 08:59:44 +12:00
|
|
|
return uuid.Validate(uuidString) == nil
|
2025-04-23 13:59:51 +12:00
|
|
|
}
|
|
|
|
|
|
|
|
func IsHexadecimal(hexString string) bool {
|
|
|
|
return hexadecimalRegex.MatchString(hexString)
|
|
|
|
}
|
|
|
|
|
|
|
|
func HasWhitespaceOnly(s string) bool {
|
2025-04-24 08:59:44 +12:00
|
|
|
return len(s) > 0 && strings.TrimSpace(s) == ""
|
2025-04-23 13:59:51 +12:00
|
|
|
}
|
|
|
|
|
|
|
|
func MinStringLength(s string, len int) bool {
|
|
|
|
return utf8.RuneCountInString(s) >= len
|
|
|
|
}
|
|
|
|
|
|
|
|
func Matches(s, pattern string) bool {
|
|
|
|
match, err := regexp.MatchString(pattern, s)
|
|
|
|
return err == nil && match
|
|
|
|
}
|
|
|
|
|
|
|
|
func IsNonPositive(f float64) bool {
|
|
|
|
return f <= 0
|
|
|
|
}
|
|
|
|
|
|
|
|
func InRange(val, left, right float64) bool {
|
|
|
|
if left > right {
|
|
|
|
left, right = right, left
|
|
|
|
}
|
|
|
|
|
|
|
|
return val >= left && val <= right
|
|
|
|
}
|
|
|
|
|
|
|
|
func IsHost(s string) bool {
|
|
|
|
return IsIP(s) || IsDNSName(s)
|
|
|
|
}
|
|
|
|
|
|
|
|
func IsIP(s string) bool {
|
|
|
|
return net.ParseIP(s) != nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func IsDNSName(s string) bool {
|
|
|
|
if s == "" || len(strings.ReplaceAll(s, ".", "")) > 255 {
|
|
|
|
// constraints already violated
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return !IsIP(s) && dnsNameRegex.MatchString(s)
|
|
|
|
}
|