-
-
Notifications
You must be signed in to change notification settings - Fork 8
/
errors.go
79 lines (70 loc) · 3.22 KB
/
errors.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
package opc
import (
"fmt"
)
var errorsString = map[int]string{
101: "a part name shall not be empty",
102: "a part content type shall not be empty",
103: "a part name shall not have empty segments",
104: "a part name shall start with a forward slash character",
105: "a part name shall not have a forward slash as the last character",
106: "a part name segment shall not hold any characters other than pchar characters",
107: "a part name segment shall not contain percent-encoded forward slash or backward slash characters",
108: "a part name segment shall not contain percent-encoded unreserved characters",
109: "a part name segment shall not end with a dot character",
110: "a part name segment shall include at least one non-dot character",
111: "a package shall not contain a part with a part name derived from another part name by appending segments to it",
112: "a package shall not contain equivalent part names",
113: "a part content type shall fit the definition and syntax for media types as specified in RFC 2616 §3.7",
114: "a part content type shall not have linear, leading or trailing white space",
125: "a relationship shall not have relationships to any other part",
126: "a relationship identifier cannot be empty and shall be unique within the relationships part",
127: "a relationship type cannot be empty",
128: "a relationship target URI reference shall be a URI or a relative reference",
129: "a relationship target URI must be relative if the TargetMode is Internal",
205: "a Default content type shall not have more than one content type for each extension and a Override shall not have more than one content type for each PartName",
206: "a package shall not have an empty extension in a Default element",
208: "a part content type shall appear in [Content_Types].xml",
310: "a package shall contain a file named [Content_Types].xml to store all the data content types",
}
// An Error from this package is always associated to an OPC entity that is not conformant with the OPC specs.
type Error struct {
code int
partName string
relID string
}
func newError(code int, partName string) *Error {
return &Error{code, partName, ""}
}
func newErrorRelationship(code int, partName, relID string) *Error {
return &Error{code, partName, relID}
}
// Code of the error as described in the OPC specs.
// The first number is the top level topic and the second and third digits are the specific error code.
// The top level topics are described as follows:
// 1. Package Model requirements
// 2. Physical Packages requirements
// 3. ZIP Physical Mapping requirements
// 4. Core Properties requirements
// 5. Thumbnail requirements
// 6. Digital Signatures requirements
// 7. Pack URI requirements
func (e *Error) Code() int {
return e.code
}
// PartName returns the name of the Part associated to the error.
func (e *Error) PartName() string {
return e.partName
}
// RelationshipID returns the ID of the relationship associated to the error.
// If the error is not associated to a relationship, the value is empty.
func (e *Error) RelationshipID() string {
return e.relID
}
func (e *Error) Error() string {
s, ok := errorsString[e.code]
if !ok {
panic("opc: undefined error")
}
return fmt.Sprintf("opc: %s: %s", e.partName, s)
}