package yu_tencent

type tlv struct{}

var Tlv tlv

func (t tlv) From(buf []byte, tlv uint16, val ...byte) []byte {
	j_len := len(val)
	buf = append(buf, byte(tlv>>8), byte(tlv), byte(j_len>>8), byte(j_len))
	buf = append(buf, val...)
	return buf
}

func (t tlv) FromInt16(buf []byte, tlv uint16, val ...int16) []byte {
	j_len := len(val) * 2
	buf = append(buf, byte(tlv>>8), byte(tlv), byte(j_len>>8), byte(j_len))
	for _, j_val := range val {
		buf = append(buf, byte(j_val>>8), byte(j_val))
	}
	return buf
}

func (t tlv) FromUint16(buf []byte, tlv uint16, val ...uint16) []byte {
	j_len := len(val) * 2
	buf = append(buf, byte(tlv>>8), byte(tlv), byte(j_len>>8), byte(j_len))
	for _, j_val := range val {
		buf = append(buf, byte(j_val>>8), byte(j_val))
	}
	return buf
}

func (t tlv) FromInt32(buf []byte, tlv uint16, val ...int32) []byte {
	j_len := len(val) * 4
	buf = append(buf, byte(tlv>>8), byte(tlv), byte(j_len>>8), byte(j_len))
	for _, j_val := range val {
		buf = append(buf, byte(j_val>>24), byte(j_val>>16), byte(j_val>>8), byte(j_val))
	}
	return buf
}

func (t tlv) FromUint32(buf []byte, tlv uint16, val ...uint32) []byte {
	j_len := len(val) * 4
	buf = append(buf, byte(tlv>>8), byte(tlv), byte(j_len>>8), byte(j_len))
	for _, j_val := range val {
		buf = append(buf, byte(j_val>>24), byte(j_val>>16), byte(j_val>>8), byte(j_val))
	}
	return buf
}

func (t tlv) FromInt64(buf []byte, tlv uint16, val ...int64) []byte {
	j_len := len(val) * 8
	buf = append(buf, byte(tlv>>8), byte(tlv), byte(j_len>>8), byte(j_len))
	for _, j_val := range val {
		buf = append(buf, byte(j_val>>56), byte(j_val>>48), byte(j_val>>40), byte(j_val>>32), byte(j_val>>24), byte(j_val>>16), byte(j_val>>8), byte(j_val))
	}
	return buf
}

func (t tlv) FromUint64(buf []byte, tlv uint16, val ...uint64) []byte {
	j_len := len(val) * 8
	buf = append(buf, byte(tlv>>8), byte(tlv), byte(j_len>>8), byte(j_len))
	for _, j_val := range val {
		buf = append(buf, byte(j_val>>56), byte(j_val>>48), byte(j_val>>40), byte(j_val>>32), byte(j_val>>24), byte(j_val>>16), byte(j_val>>8), byte(j_val))
	}
	return buf
}

func (t tlv) FromB(buf []byte, tlv uint16, val ...[]byte) []byte {
	var j_len int
	for _, j_val := range val {
		j_len += len(j_val)
	}
	buf = append(buf, byte(tlv>>8), byte(tlv), byte(j_len>>8), byte(j_len))
	for _, j_val := range val {
		buf = append(buf, j_val...)
	}
	return buf
}

func (t tlv) FromS(buf []byte, tlv uint16, val ...string) []byte {
	var j_len int
	for _, j_val := range val {
		j_len += len(j_val)
	}
	buf = append(buf, byte(tlv>>8), byte(tlv), byte(j_len>>8), byte(j_len))
	for _, j_val := range val {
		buf = append(buf, j_val...)
	}
	return buf
}
