Files
openfsd/protocol/client_query.go
Reese Norris 05ed593a4b initial commit
2024-04-04 19:40:43 -07:00

65 lines
1.4 KiB
Go

package protocol
import (
"fmt"
"strings"
)
type ClientQueryPDU struct {
From string `validate:"required,alphanum,max=7"`
To string `validate:"required,max=7"`
QueryType string `validate:"required,ascii,min=2,max=7"`
Payload string `validate:""`
}
func (p *ClientQueryPDU) Serialize() string {
if p.Payload == "" {
return fmt.Sprintf("$CQ%s:%s:%s%s", p.From, p.To, p.QueryType, PacketDelimeter)
} else {
return fmt.Sprintf("$CQ%s:%s:%s:%s%s", p.From, p.To, p.QueryType, p.Payload, PacketDelimeter)
}
}
func ParseClientQueryPDU(rawPacket string) (*ClientQueryPDU, error) {
rawPacket = strings.TrimSuffix(rawPacket, PacketDelimeter)
rawPacket = strings.TrimPrefix(rawPacket, "$CQ")
fields := strings.SplitN(rawPacket, Delimeter, 4)
if len(fields) < 3 {
return nil, NewGenericFSDError(SyntaxError)
}
payload := ""
if len(fields) == 4 {
payload = fields[3]
}
pdu := ClientQueryPDU{
From: fields[0],
To: fields[1],
QueryType: fields[2],
Payload: payload,
}
err := V.Struct(pdu)
if err != nil {
return nil, NewGenericFSDError(SyntaxError)
}
switch pdu.QueryType {
case "ATC", "CAPS", "C?",
"RN", "SV", "ATIS",
"IP", "INF", "FP",
"IPC", "BY", "HI",
"HLP", "NOHLP", "WH",
"IT", "HT", "DR",
"FA", "TA", "BC",
"SC", "VT", "ACC",
"NEWINFO", "NEWATIS", "EST",
"GD":
default:
return nil, NewGenericFSDError(SyntaxError)
}
return &pdu, nil
}