error_utils.go raw

   1  package xml
   2  
   3  import (
   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
  11  type ErrorComponents struct {
  12  	Code    string
  13  	Message string
  14  }
  15  
  16  // GetErrorResponseComponents returns the error fields from an xml error response body
  17  func 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
  41  type 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>
  48  type wrappedErrorResponse struct {
  49  	Code    string `xml:"Error>Code"`
  50  	Message string `xml:"Error>Message"`
  51  }
  52