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) } }