// Copyright 2021, Henrik Sölver henrik.solver@gmail.com // SPDX-License-Identifier: BSD-3-Clause package ipp import ( "bufio" "bytes" "encoding/binary" "fmt" ) type Integer struct { name string values []int32 } func NewInteger(name string, values ...int32) *Integer { e := new(Integer) e.name = name e.values = values return e } func (i Integer) Name() string { return i.name } func (i Integer) String() string { return i.name + ":" + fmt.Sprint(i.values) } func (i *Integer) valueTag() tag { return integerValueTag } func (i *Integer) addValue(v interface{}) { i.values = append(i.values, v.(int32)) } func (i *Integer) marshal() []byte { return marshalInteger(integerValueTag, i.name, i.values) } func (i *Integer) unmarshal(byteStream *bufio.Reader) { soi, err := unmarshalIntegers(byteStream, integerValueTag) if err != nil { return } i.name = soi.name i.values = soi.values } func marshalInteger(t tag, name string, values []int32) []byte { l := 9 + len(name) + 9*(len(values)-1) b := make([]byte, 0, l) buf := bytes.NewBuffer(b) buf.WriteByte(byte(t)) binary.Write(buf, binary.BigEndian, uint16(len(name))) buf.WriteString(name) binary.Write(buf, binary.BigEndian, uint16(4)) binary.Write(buf, binary.BigEndian, values[0]) for _, v := range values[1:] { buf.WriteByte(byte(t)) binary.Write(buf, binary.BigEndian, uint16(0)) binary.Write(buf, binary.BigEndian, uint16(4)) binary.Write(buf, binary.BigEndian, v) } return buf.Bytes() }