package core

import "net"
import "sync"

// DNSClient is a V2Ray feature for querying DNS information.
type DNSClient interface {
	Feature
	LookupIP(host string) ([]net.IP, error)
}

type syncDNSClient struct {
	sync.RWMutex
	DNSClient
}

func (d *syncDNSClient) LookupIP(host string) ([]net.IP, error) {
	d.RLock()
	defer d.RUnlock()

	if d.DNSClient == nil {
		return net.LookupIP(host)
	}

	return d.DNSClient.LookupIP(host)
}

func (d *syncDNSClient) Start() error {
	d.RLock()
	defer d.RUnlock()

	if d.DNSClient == nil {
		return nil
	}

	return d.DNSClient.Start()
}

func (d *syncDNSClient) Close() {
	d.RLock()
	defer d.RUnlock()

	if d.DNSClient != nil {
		d.DNSClient.Close()
	}
}

func (d *syncDNSClient) Set(client DNSClient) {
	if client == nil {
		return
	}

	d.Lock()
	defer d.Unlock()

	d.DNSClient = client
}