1package xml
2
3import (
4 "encoding/xml"
5 "fmt"
6 "io"
7)
8
9// ErrorComponents represents the error response fields
10// that will be deserialized from an xml error response body
11type ErrorComponents struct {
12 Code string
13 Message string
14}
15
16// GetErrorResponseComponents returns the error fields from an xml error response body
17func GetErrorResponseComponents(r io.Reader, noErrorWrapping bool) (ErrorComponents, error) {
18 if noErrorWrapping {
19 var errResponse noWrappedErrorResponse
20 if err := xml.NewDecoder(r).Decode(&errResponse); err != nil && err != io.EOF {
21 return ErrorComponents{}, fmt.Errorf("error while deserializing xml error response: %w", err)
22 }
23 return ErrorComponents{
24 Code: errResponse.Code,
25 Message: errResponse.Message,
26 }, nil
27 }
28
29 var errResponse wrappedErrorResponse
30 if err := xml.NewDecoder(r).Decode(&errResponse); err != nil && err != io.EOF {
31 return ErrorComponents{}, fmt.Errorf("error while deserializing xml error response: %w", err)
32 }
33 return ErrorComponents{
34 Code: errResponse.Code,
35 Message: errResponse.Message,
36 }, nil
37}
38
39// noWrappedErrorResponse represents the error response body with
40// no internal <Error></Error wrapping
41type noWrappedErrorResponse struct {
42 Code string `xml:"Code"`
43 Message string `xml:"Message"`
44}
45
46// wrappedErrorResponse represents the error response body
47// wrapped within <Error>...</Error>
48type wrappedErrorResponse struct {
49 Code string `xml:"Error>Code"`
50 Message string `xml:"Error>Message"`
51}