package net

// Destination represents a network destination including address and protocol (tcp / udp).
type Destination interface {
	Network() string  // Protocol of communication (tcp / udp)
	Address() Address // Address of destination
	String() string   // String representation of the destination

	IsTCP() bool // True if destination is reachable via TCP
	IsUDP() bool // True if destination is reachable via UDP
}

// NewTCPDestination creates a TCP destination with given address
func NewTCPDestination(address Address) Destination {
	return TCPDestination{address: address}
}

// NewUDPDestination creates a UDP destination with given address
func NewUDPDestination(address Address) Destination {
	return UDPDestination{address: address}
}

type TCPDestination struct {
	address Address
}

func (dest TCPDestination) Network() string {
	return "tcp"
}

func (dest TCPDestination) Address() Address {
	return dest.address
}

func (dest TCPDestination) String() string {
	return "tcp:" + dest.address.String()
}

func (dest TCPDestination) IsTCP() bool {
	return true
}

func (dest TCPDestination) IsUDP() bool {
	return false
}

type UDPDestination struct {
	address Address
}

func (dest UDPDestination) Network() string {
	return "udp"
}

func (dest UDPDestination) Address() Address {
	return dest.address
}

func (dest UDPDestination) String() string {
	return "udp:" + dest.address.String()
}

func (dest UDPDestination) IsTCP() bool {
	return false
}

func (dest UDPDestination) IsUDP() bool {
	return true
}