package magna import ( "encoding/binary" "fmt" ) // Decode decodes a question from buf at the offset func (q *Question) Decode(buf []byte, offset int) (int, error) { var err error q.QName, offset, err = decodeDomain(buf, offset) if err != nil { return offset, fmt.Errorf("question decode: failed to decode QName: %w", err) } qtype, offset, err := getU16(buf, offset) if err != nil { return offset, fmt.Errorf("question decode: failed to decode QType for %s: %w", q.QName, err) } qclass, offset, err := getU16(buf, offset) if err != nil { return offset, fmt.Errorf("question decode: failed to decode QClass for %s: %w", q.QName, err) } q.QType = DNSType(qtype) q.QClass = DNSClass(qclass) return offset, nil } // Encode serializes a Question into bytes, using a map to handle domain name compression offsets. func (q *Question) Encode(bytes []byte, offsets *map[string]uint16) ([]byte, error) { var err error bytes, err = encodeDomain(bytes, q.QName, offsets) if err != nil { return nil, fmt.Errorf("question encode: failed to encode QName %s: %w", q.QName, err) } bytes = binary.BigEndian.AppendUint16(bytes, uint16(q.QType)) bytes = binary.BigEndian.AppendUint16(bytes, uint16(q.QClass)) return bytes, nil }