// Copyright 2018 The agentx authors
// Licensed under the LGPLv3 with static-linking exception.
// See LICENCE file for details.

package pdu

import (
	"bytes"
	"encoding/binary"
)

// OctetString defines the pdu description packet.
type OctetString struct {
	Text string
}

// MarshalBinary returns the pdu packet as a slice of bytes.
func (o *OctetString) MarshalBinary() ([]byte, error) {
	buffer := &bytes.Buffer{}

	binary.Write(buffer, binary.LittleEndian, uint32(len(o.Text)))
	buffer.WriteString(o.Text)

	for buffer.Len()%4 > 0 {
		buffer.WriteByte(0x00)
	}

	return buffer.Bytes(), nil
}

// UnmarshalBinary sets the packet structure from the provided slice of bytes.
func (o *OctetString) UnmarshalBinary(data []byte) error {
	buffer := bytes.NewBuffer(data)

	length := uint32(0)
	if err := binary.Read(buffer, binary.LittleEndian, &length); err != nil {
		return err
	}

	o.Text = string(data[4 : 4+length])

	return nil
}