package aprs import "strings" type Address struct { Call string `json:"call"` SSID string `json:"ssid,omitempty"` IsRepeated bool `json:"is_repeated"` } func ParseAddress(s string) Address { r := strings.HasSuffix(s, "*") if r { s = strings.TrimSuffix(s, "*") } i := strings.IndexByte(s, '-') if i < 1 { return Address{ Call: s, IsRepeated: r, } } return Address{ Call: s[:i], SSID: s[i+1:], IsRepeated: r, } } func (a Address) EqualTo(b Address) bool { return strings.EqualFold(a.Call, b.Call) && a.SSID == b.SSID } func (a Address) IsQConstruct() bool { return len(a.Call) == 3 && len(a.SSID) == 0 && a.Call[0] == 'q' } func (a Address) Passcode() int16 { v := int16(0x73e2) for i, l := 0, len(a.Call); i < l; i = i + 2 { v ^= int16(a.Call[i]) << 8 if i+1 < len(a.Call) { v ^= int16(a.Call[i+1]) } } return v & 0x7fff } func (a Address) String() string { var b strings.Builder b.WriteString(a.Call) if a.SSID != "" { b.WriteByte('-') b.WriteString(a.SSID) } if a.IsRepeated { b.WriteByte('*') } return b.String() } type Path []Address func (path Path) EqualTo(other Path) bool { if len(path) != len(other) { return false } for i, a := range path { if !a.EqualTo(other[i]) { return false } } return true } func (path Path) String() string { part := make([]string, len(path)) for i, a := range path { part[i] = a.String() } return strings.Join(part, ",") }