// Autogenerated Go message buffer code.
// Source: offboardVision.clad
// Full command line: victor-clad/tools/message-buffers/emitters/Go_emitter.py -C clad/types -I coretech/vision/clad_src coretech/common/clad_src -o generated/cladgo/src/clad/vision offboardVision.clad

package vision

import (
	"bytes"
	"encoding/binary"
	"errors"
	"fmt"
)

// ENUM OffboardCommsType
type OffboardCommsType uint8

const (
	OffboardCommsType_FileIO OffboardCommsType = iota
	OffboardCommsType_CLAD
)

// STRUCTURE OffboardImageReady
type OffboardImageReady struct {
	Timestamp    uint32
	NumRows      uint32
	NumCols      uint32
	NumChannels  uint32
	IsCompressed bool
	IsEncrypted  bool
	ProcTypes    []string
	Filename     string
}

func (o *OffboardImageReady) Size() uint32 {
	var result uint32
	result += 4 // Timestamp uint_32
	result += 4 // NumRows uint_32
	result += 4 // NumCols uint_32
	result += 4 // NumChannels uint_32
	result += 1 // IsCompressed bool
	result += 1 // IsEncrypted bool
	result += 1 // ProcTypes length (uint_8)
	for idx := range o.ProcTypes {
		result += 1                             // ProcTypes[idx] length (uint_8)
		result += uint32(len(o.ProcTypes[idx])) // uint_8 array
	}
	result += 1                       // Filename length (uint_8)
	result += uint32(len(o.Filename)) // uint_8 array
	return result
}

func (o *OffboardImageReady) Unpack(buf *bytes.Buffer) error {
	if err := binary.Read(buf, binary.LittleEndian, &o.Timestamp); err != nil {
		return err
	}
	if err := binary.Read(buf, binary.LittleEndian, &o.NumRows); err != nil {
		return err
	}
	if err := binary.Read(buf, binary.LittleEndian, &o.NumCols); err != nil {
		return err
	}
	if err := binary.Read(buf, binary.LittleEndian, &o.NumChannels); err != nil {
		return err
	}
	if err := binary.Read(buf, binary.LittleEndian, &o.IsCompressed); err != nil {
		return err
	}
	if err := binary.Read(buf, binary.LittleEndian, &o.IsEncrypted); err != nil {
		return err
	}
	var ProcTypesLen uint8
	if err := binary.Read(buf, binary.LittleEndian, &ProcTypesLen); err != nil {
		return err
	}
	o.ProcTypes = make([]string, ProcTypesLen)
	for idx := range o.ProcTypes {
		var ProcTypesidxLen uint8
		if err := binary.Read(buf, binary.LittleEndian, &ProcTypesidxLen); err != nil {
			return err
		}
		o.ProcTypes[idx] = string(buf.Next(int(ProcTypesidxLen)))
		if len(o.ProcTypes[idx]) != int(ProcTypesidxLen) {
			return errors.New("string byte mismatch")
		}
	}
	var FilenameLen uint8
	if err := binary.Read(buf, binary.LittleEndian, &FilenameLen); err != nil {
		return err
	}
	o.Filename = string(buf.Next(int(FilenameLen)))
	if len(o.Filename) != int(FilenameLen) {
		return errors.New("string byte mismatch")
	}
	return nil
}

func (o *OffboardImageReady) Pack(buf *bytes.Buffer) error {
	if err := binary.Write(buf, binary.LittleEndian, o.Timestamp); err != nil {
		return err
	}
	if err := binary.Write(buf, binary.LittleEndian, o.NumRows); err != nil {
		return err
	}
	if err := binary.Write(buf, binary.LittleEndian, o.NumCols); err != nil {
		return err
	}
	if err := binary.Write(buf, binary.LittleEndian, o.NumChannels); err != nil {
		return err
	}
	if err := binary.Write(buf, binary.LittleEndian, o.IsCompressed); err != nil {
		return err
	}
	if err := binary.Write(buf, binary.LittleEndian, o.IsEncrypted); err != nil {
		return err
	}
	if len(o.ProcTypes) > 255 {
		return errors.New("max_length overflow in field ProcTypes")
	}
	if err := binary.Write(buf, binary.LittleEndian, uint8(len(o.ProcTypes))); err != nil {
		return err
	}
	for idx := range o.ProcTypes {
		if len(o.ProcTypes[idx]) > 255 {
			return errors.New("max_length overflow in field ProcTypes[idx]")
		}
		if err := binary.Write(buf, binary.LittleEndian, uint8(len(o.ProcTypes[idx]))); err != nil {
			return err
		}
		if _, err := buf.WriteString(o.ProcTypes[idx]); err != nil {
			return err
		}
	}
	if len(o.Filename) > 255 {
		return errors.New("max_length overflow in field Filename")
	}
	if err := binary.Write(buf, binary.LittleEndian, uint8(len(o.Filename))); err != nil {
		return err
	}
	if _, err := buf.WriteString(o.Filename); err != nil {
		return err
	}
	return nil
}

func (o *OffboardImageReady) String() string {
	return fmt.Sprint("Timestamp: {", o.Timestamp, "} ",
		"NumRows: {", o.NumRows, "} ",
		"NumCols: {", o.NumCols, "} ",
		"NumChannels: {", o.NumChannels, "} ",
		"IsCompressed: {", o.IsCompressed, "} ",
		"IsEncrypted: {", o.IsEncrypted, "} ",
		"ProcTypes: {", o.ProcTypes, "} ",
		"Filename: {", o.Filename, "}")
}

// STRUCTURE OffboardResultReady
type OffboardResultReady struct {
	Timestamp  uint32
	JsonResult string
}

func (o *OffboardResultReady) Size() uint32 {
	var result uint32
	result += 4                         // Timestamp uint_32
	result += 2                         // JsonResult length (uint_16)
	result += uint32(len(o.JsonResult)) // uint_8 array
	return result
}

func (o *OffboardResultReady) Unpack(buf *bytes.Buffer) error {
	if err := binary.Read(buf, binary.LittleEndian, &o.Timestamp); err != nil {
		return err
	}
	var JsonResultLen uint16
	if err := binary.Read(buf, binary.LittleEndian, &JsonResultLen); err != nil {
		return err
	}
	o.JsonResult = string(buf.Next(int(JsonResultLen)))
	if len(o.JsonResult) != int(JsonResultLen) {
		return errors.New("string byte mismatch")
	}
	return nil
}

func (o *OffboardResultReady) Pack(buf *bytes.Buffer) error {
	if err := binary.Write(buf, binary.LittleEndian, o.Timestamp); err != nil {
		return err
	}
	if len(o.JsonResult) > 65535 {
		return errors.New("max_length overflow in field JsonResult")
	}
	if err := binary.Write(buf, binary.LittleEndian, uint16(len(o.JsonResult))); err != nil {
		return err
	}
	if _, err := buf.WriteString(o.JsonResult); err != nil {
		return err
	}
	return nil
}

func (o *OffboardResultReady) String() string {
	return fmt.Sprint("Timestamp: {", o.Timestamp, "} ",
		"JsonResult: {", o.JsonResult, "}")
}
