/
error.go
96 lines (88 loc) · 3.63 KB
/
error.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package cairo
//#cgo pkg-config: cairo
//#include <cairo/cairo.h>
import "C"
import (
"errors"
)
const (
errSuccess = C.CAIRO_STATUS_SUCCESS
errNoMem = C.CAIRO_STATUS_NO_MEMORY
errInvalidRestore = C.CAIRO_STATUS_INVALID_RESTORE
errInvalidPopGroup = C.CAIRO_STATUS_INVALID_POP_GROUP
errNoCurrentPoint = C.CAIRO_STATUS_NO_CURRENT_POINT
errInvalidMatrix = C.CAIRO_STATUS_INVALID_MATRIX
errInvalidStatus = C.CAIRO_STATUS_INVALID_STATUS //seriously?
errNullPointer = C.CAIRO_STATUS_NULL_POINTER
errInvalidString = C.CAIRO_STATUS_INVALID_STRING
errInvalidPathData = C.CAIRO_STATUS_INVALID_PATH_DATA
errReadError = C.CAIRO_STATUS_READ_ERROR
errWriteError = C.CAIRO_STATUS_WRITE_ERROR
errSurfaceFinished = C.CAIRO_STATUS_SURFACE_FINISHED
errSurfaceTypeMismatch = C.CAIRO_STATUS_SURFACE_TYPE_MISMATCH
errPatternTypeMismatch = C.CAIRO_STATUS_PATTERN_TYPE_MISMATCH
errInvalidContent = C.CAIRO_STATUS_INVALID_CONTENT
errInvalidFormat = C.CAIRO_STATUS_INVALID_FORMAT
errInvalidVisual = C.CAIRO_STATUS_INVALID_VISUAL
errFileNotFound = C.CAIRO_STATUS_FILE_NOT_FOUND
errInvalidDash = C.CAIRO_STATUS_INVALID_DASH
errInvalidDSCComment = C.CAIRO_STATUS_INVALID_DSC_COMMENT
errInvalidIndex = C.CAIRO_STATUS_INVALID_INDEX
errClipNotRepresentable = C.CAIRO_STATUS_CLIP_NOT_REPRESENTABLE
errTempFileError = C.CAIRO_STATUS_TEMP_FILE_ERROR
errInvalidStride = C.CAIRO_STATUS_INVALID_STRIDE
errFontTypeMismatch = C.CAIRO_STATUS_FONT_TYPE_MISMATCH
errUserFontImmutable = C.CAIRO_STATUS_USER_FONT_IMMUTABLE
errUserFontError = C.CAIRO_STATUS_USER_FONT_ERROR
errNegativeCount = C.CAIRO_STATUS_NEGATIVE_COUNT
errInvalidClusters = C.CAIRO_STATUS_INVALID_CLUSTERS
errInvalidSlant = C.CAIRO_STATUS_INVALID_SLANT
errInvalidWeight = C.CAIRO_STATUS_INVALID_WEIGHT
errInvalidSize = C.CAIRO_STATUS_INVALID_SIZE
errUserFontNotImplemented = C.CAIRO_STATUS_USER_FONT_NOT_IMPLEMENTED
errDeviceTypeMismatch = C.CAIRO_STATUS_DEVICE_TYPE_MISMATCH
errDeviceError = C.CAIRO_STATUS_DEVICE_ERROR
errInvalidMeshConstruction = C.CAIRO_STATUS_INVALID_MESH_CONSTRUCTION
errDeviceFinished = C.CAIRO_STATUS_DEVICE_FINISHED
errLastStatus = C.CAIRO_STATUS_LAST_STATUS
)
var (
//ErrInvalidLibcairoHandle is returned if a Go handle to a libcairo resource
//has no pointer to any libcairo resource.
ErrInvalidLibcairoHandle = errors.New("invalid handle to libcairo resource")
//ErrInvalidPathData is returned if a Path contains undefined data.
ErrInvalidPathData = mkerr(errInvalidPathData)
//ErrInvalidDash is returned by Context.SetDash if the dash format
//is ill-specified.
ErrInvalidDash = mkerr(errInvalidDash)
)
func st2str(st C.cairo_status_t) string {
return C.GoString(C.cairo_status_to_string(st))
}
func mkerr(st C.cairo_status_t) error {
return errors.New(st2str(st))
}
func toerr(st C.cairo_status_t) error {
return toerrIded(st, nil)
}
func toerrIded(st C.cairo_status_t, ider interface {
id() id
}) error {
switch int(st) {
case errSuccess:
return nil
case errInvalidRestore, errInvalidPopGroup, errNoCurrentPoint, errInvalidMatrix, errInvalidString, errSurfaceFinished:
panic(st2str(st))
case errInvalidPathData:
return ErrInvalidPathData
case errInvalidDash:
return ErrInvalidDash
case errWriteError:
mux.Lock()
defer mux.Unlock()
if w, ok := wmap[ider.id()]; ok {
return w.err
}
}
return errors.New(st2str(st))
}