func (f *FidoAddr) FQDN() (string, error) {
	if f.point > 0 {
		return "", errors.New("point")
	}
	return "f" + strconv.Itoa(int(f.node)) + ".n" + strconv.Itoa(int(f.net)) + ".z" + strconv.Itoa(int(f.zone)) + ".binkp.net", nil
}
FQDN return hostname
package types
import (
	"errors"
	"regexp"
	"strconv"
)
type FidoAddr struct {
	zone  uint16
	net   uint16
	node  uint16
	point uint16
}
var (
	fidoAddrRE = regexp.MustCompile(`(\d+):(\d+)/(\d+)\.?(\d+)?(@.*)?`)
)
func (f *FidoAddr) Equal(fn *FidoAddr) bool {
	if f.zone == fn.zone && f.net == fn.net && f.node == fn.node && f.point == fn.point {
		return true
	}
	return false
}
func (f *FidoAddr) String() string {
	if f == nil {
		return ""
	}
	if f.zone == 0 {
		return ""
	}
	if f.point == 0 {
		return strconv.Itoa(int(f.zone)) + ":" + strconv.Itoa(int(f.net)) + "/" + strconv.Itoa(int(f.node))
	}
	return strconv.Itoa(int(f.zone)) + ":" + strconv.Itoa(int(f.net)) + "/" + strconv.Itoa(int(f.node)) + "." + strconv.Itoa(int(f.point))
}
func (f *FidoAddr) ShortString() string {
	if f.zone == 0 {
		return ""
	}
	return strconv.Itoa(int(f.zone)) + ":" + strconv.Itoa(int(f.net))
}