1package packets
2
3import (
4	"bytes"
5	"fmt"
6	"io"
7)
8
9//SubackPacket is an internal representation of the fields of the
10//Suback MQTT packet
11type SubackPacket struct {
12	FixedHeader
13	MessageID   uint16
14	ReturnCodes []byte
15}
16
17func (sa *SubackPacket) String() string {
18	str := fmt.Sprintf("%s", sa.FixedHeader)
19	str += " "
20	str += fmt.Sprintf("MessageID: %d", sa.MessageID)
21	return str
22}
23
24func (sa *SubackPacket) Write(w io.Writer) error {
25	var body bytes.Buffer
26	var err error
27	body.Write(encodeUint16(sa.MessageID))
28	body.Write(sa.ReturnCodes)
29	sa.FixedHeader.RemainingLength = body.Len()
30	packet := sa.FixedHeader.pack()
31	packet.Write(body.Bytes())
32	_, err = packet.WriteTo(w)
33
34	return err
35}
36
37//Unpack decodes the details of a ControlPacket after the fixed
38//header has been read
39func (sa *SubackPacket) Unpack(b io.Reader) error {
40	var qosBuffer bytes.Buffer
41	var err error
42	sa.MessageID, err = decodeUint16(b)
43	if err != nil {
44		return err
45	}
46
47	_, err = qosBuffer.ReadFrom(b)
48	if err != nil {
49		return err
50	}
51	sa.ReturnCodes = qosBuffer.Bytes()
52
53	return nil
54}
55
56//Details returns a Details struct containing the Qos and
57//MessageID of this ControlPacket
58func (sa *SubackPacket) Details() Details {
59	return Details{Qos: 0, MessageID: sa.MessageID}
60}
61