errors.go
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)
}