summaryrefslogtreecommitdiff
path: root/rrdformat/rrdbinary/errors.go
diff options
context:
space:
mode:
Diffstat (limited to 'rrdformat/rrdbinary/errors.go')
-rw-r--r--rrdformat/rrdbinary/errors.go100
1 files changed, 100 insertions, 0 deletions
diff --git a/rrdformat/rrdbinary/errors.go b/rrdformat/rrdbinary/errors.go
new file mode 100644
index 0000000..984e0a5
--- /dev/null
+++ b/rrdformat/rrdbinary/errors.go
@@ -0,0 +1,100 @@
+package rrdbinary
+
+import (
+ "fmt"
+ "io"
+)
+
+// A BinaryError is an error that results from malformed binary input.
+type BinaryError struct {
+ msg string
+ ctxPos int
+ ctxDat []byte
+ ctxEOF bool
+}
+
+func newBinError(msg string, ctxFile []byte, ctxStart, ctxLen int) error {
+ if ctxStart+ctxLen > len(ctxFile) {
+ ctxLen = len(ctxFile) - ctxStart
+ }
+ return BinaryError{
+ msg: msg,
+ ctxPos: ctxStart,
+ ctxDat: ctxFile[ctxStart : ctxStart+ctxLen],
+ ctxEOF: ctxStart+ctxLen == len(ctxFile),
+ }
+}
+
+func (e BinaryError) Error() string {
+ return "invalid RRD: " + e.msg
+}
+
+var cAsciiEscapes = map[byte]byte{
+ 0x00: '0',
+ 0x07: 'a',
+ 0x08: 'b',
+ 0x09: 't',
+ 0x0A: 'n',
+ 0x0B: 'v',
+ 0x0C: 'f',
+ 0x0D: 'r',
+}
+
+func (e BinaryError) Format(s fmt.State, verb rune) {
+ switch verb {
+ case 'v':
+ io.WriteString(s, e.Error())
+ if s.Flag('+') {
+ fmt.Fprintf(s, "\n\tat byte %d:", e.ctxPos)
+ io.WriteString(s, "\n\t\tascii:")
+ for _, byte := range e.ctxDat {
+ if ' ' <= byte && byte <= '~' {
+ fmt.Fprintf(s, " %c", byte)
+ } else if c, ok := cAsciiEscapes[byte]; ok {
+ fmt.Fprintf(s, " \\%c", c)
+ } else {
+ io.WriteString(s, " ??")
+ }
+ }
+ if e.ctxEOF {
+ io.WriteString(s, " <EOF>")
+ }
+ io.WriteString(s, "\n\t\thex :")
+ for _, byte := range e.ctxDat {
+ fmt.Fprintf(s, " %02x", byte)
+ }
+ if e.ctxEOF {
+ io.WriteString(s, " <EOF>")
+ }
+ io.WriteString(s, "\n")
+ }
+ case 's':
+ io.WriteString(s, e.Error())
+ case 'q':
+ fmt.Fprintf(s, "%q", e.Error())
+ }
+}
+
+// A TypeError is an error that results from Marshal or Unmmarshal
+// being passed a Go type that they cannot handle.
+type TypeError string
+
+func (e TypeError) Error() string {
+ return string(e)
+}
+
+func typeErrorf(format string, a ...interface{}) error {
+ return TypeError(fmt.Sprintf(format, a...))
+}
+
+// An ArchError is an error that results from Marshal or Unmmarshal
+// being passed an invalid Architecture.
+type ArchError string
+
+func (e ArchError) Error() string {
+ return "invalid rrdbinary.Architecture: "+string(e)
+}
+
+func archErrorf(format string, a ...interface{}) error {
+ return ArchError(fmt.Sprintf(format, a...))
+}