view pkg/misc/encode.go @ 1065:cdee23f3ee4c crossprofile

closed branch crossprofile
author Thomas Junk <thomas.junk@intevation.de>
date Fri, 26 Oct 2018 08:51:56 +0200
parents a244b18cb916
children 5b9b8eabcd01
line wrap: on
line source

// This is Free Software under GNU Affero General Public License v >= 3.0
// without warranty, see README.md and license for details.
//
// SPDX-License-Identifier: AGPL-3.0-or-later
// License-Filename: LICENSES/AGPL-3.0.txt
//
// Copyright (C) 2018 by via donau
//   – Österreichische Wasserstraßen-Gesellschaft mbH
// Software engineering by Intevation GmbH
//
// Author(s):
//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>

package misc

import (
	"encoding/binary"
	"io"
)

type BinReader struct {
	io.Reader
	Err error
}

func (r *BinReader) Read(buf []byte) (int, error) {
	if r.Err != nil {
		return 0, r.Err
	}
	var n int
	n, r.Err = r.Read(buf)
	return n, r.Err
}

func (r *BinReader) ReadBin(x interface{}) {
	if r.Err == nil {
		r.Err = binary.Read(r.Reader, binary.BigEndian, x)
	}
}

func (r *BinReader) ReadString(s *string) {
	if r.Err != nil {
		return
	}
	var l uint32
	if r.Err = binary.Read(r.Reader, binary.BigEndian, &l); r.Err != nil {
		return
	}
	b := make([]byte, l)
	if r.Err = binary.Read(r.Reader, binary.BigEndian, b); r.Err != nil {
		return
	}
	*s = string(b)
}

type BinWriter struct {
	io.Writer
	Err error
}

func (w *BinWriter) Write(buf []byte) (int, error) {
	if w.Err != nil {
		return 0, w.Err
	}
	var n int
	n, w.Err = w.Writer.Write(buf)
	return n, w.Err
}

func (w *BinWriter) WriteBin(x interface{}) {
	if w.Err == nil {
		w.Err = binary.Write(w.Writer, binary.BigEndian, x)
	}
}

func (w *BinWriter) WriteString(s string) {
	if w.Err == nil {
		w.Err = binary.Write(w.Writer, binary.BigEndian, uint32(len(s)))
	}
	if w.Err == nil {
		w.Err = binary.Write(w.Writer, binary.BigEndian, []byte(s))
	}
}