40 lines
937 B
Go
40 lines
937 B
Go
|
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
|
||
|
|
||
|
package containerlog
|
||
|
|
||
|
import (
|
||
|
"io"
|
||
|
"encoding/binary"
|
||
|
)
|
||
|
|
||
|
func Header(r io.Reader) (s StreamType, size uint64, err error) {
|
||
|
var header []byte = make([]byte, 8)
|
||
|
if _, err = io.ReadFull(r, header); err == nil {
|
||
|
s = StreamType(header[0])
|
||
|
if err = s.Validate(); err == nil {
|
||
|
header[0] = 0x0
|
||
|
size = binary.BigEndian.Uint64(header)
|
||
|
}
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func ReadMessage(r io.Reader, size uint64) (message string, err error) {
|
||
|
var messageData []byte = make([]byte, size)
|
||
|
var bytesRead int
|
||
|
if bytesRead, err = r.Read(messageData); err == nil && uint64(bytesRead) == size {
|
||
|
message = string(messageData)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func Read(r io.Reader) (s StreamType, message string, err error) {
|
||
|
var messageSize uint64
|
||
|
if s, messageSize, err = Header(r); err == nil {
|
||
|
if message, err = ReadMessage(r, messageSize); err == nil {
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
return
|
||
|
}
|