whoissdk/lookup_strategy.go

90 lines
2.3 KiB
Go
Raw Normal View History

2026-03-19 11:53:07 +08:00
package whois
import "strings"
// LookupStrategy provides per-TLD mode mapping used when Lookup mode is auto.
type LookupStrategy struct {
DefaultMode LookupMode
TLDModes map[string]LookupMode
}
func defaultLookupStrategy() LookupStrategy {
return LookupStrategy{
DefaultMode: LookupModeAutoPreferRDAP,
TLDModes: map[string]LookupMode{},
}
}
func cloneLookupStrategy(in LookupStrategy) LookupStrategy {
out := LookupStrategy{
DefaultMode: in.DefaultMode,
TLDModes: map[string]LookupMode{},
}
for k, v := range in.TLDModes {
tld := normalizeRDAPTLD(k)
if tld == "" {
continue
}
out.TLDModes[tld] = normalizeLookupMode(v)
}
return out
}
func (s LookupStrategy) modeForDomain(domain string, fallback LookupMode) LookupMode {
tld := normalizeRDAPTLD(getExtension(domain))
if tld != "" {
if m, ok := s.TLDModes[tld]; ok {
return normalizeLookupMode(m)
}
}
if strings.TrimSpace(string(s.DefaultMode)) != "" {
return normalizeLookupMode(s.DefaultMode)
}
return normalizeLookupMode(fallback)
}
func (o LookupOptions) resolveMode(domain string) LookupMode {
mode := normalizeLookupMode(o.Mode)
if mode != LookupModeAutoPreferRDAP {
return mode
}
return o.Strategy.modeForDomain(domain, mode)
}
// WithLookupStrategy sets full lookup strategy.
func WithLookupStrategy(strategy LookupStrategy) LookupOpt {
return func(o *LookupOptions) {
o.Strategy = cloneLookupStrategy(strategy)
}
}
// WithLookupTLDStrategy sets one tld-specific lookup mode used under auto mode.
func WithLookupTLDStrategy(tld string, mode LookupMode) LookupOpt {
return func(o *LookupOptions) {
if o.Strategy.TLDModes == nil {
o.Strategy.TLDModes = map[string]LookupMode{}
}
key := normalizeRDAPTLD(tld)
if key == "" {
return
}
o.Strategy.TLDModes[key] = normalizeLookupMode(mode)
}
}
// WithLookupTLDStrategies sets multiple tld-specific lookup modes used under auto mode.
func WithLookupTLDStrategies(m map[string]LookupMode) LookupOpt {
return func(o *LookupOptions) {
for tld, mode := range m {
WithLookupTLDStrategy(tld, mode)(o)
}
}
}
// WithLookupStrategyDefaultMode sets default strategy mode used under auto mode.
func WithLookupStrategyDefaultMode(mode LookupMode) LookupOpt {
return func(o *LookupOptions) {
o.Strategy.DefaultMode = normalizeLookupMode(mode)
}
}