...

Source file src/edge-infra.dev/pkg/sds/interlock/internal/errors/errors.go

Documentation: edge-infra.dev/pkg/sds/interlock/internal/errors

     1  package errors
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/gin-gonic/gin"
     7  	"github.com/go-playground/validator/v10"
     8  )
     9  
    10  var (
    11  	ReadOnlyFieldMessage          = "is read-only"
    12  	RequiredFieldMessage          = "is required"
    13  	InvalidRFC1123HostnameMessage = "must be a valid RFC 1123 Hostname"
    14  )
    15  
    16  // NewErrorResponse returns a new gin API error response
    17  func NewErrorResponse(errors ...*Error) gin.H {
    18  	return gin.H{
    19  		"errors": errors,
    20  	}
    21  }
    22  
    23  // Error represents an individual error returned by the API
    24  //
    25  // swagger:model
    26  type Error struct {
    27  	// A description of the error
    28  	//
    29  	// required: true
    30  	// example: X is a read-only field
    31  	Detail string `json:"detail"`
    32  }
    33  
    34  // NewError returns a new error struct containing the provided detail
    35  func NewError(detail string) *Error {
    36  	return &Error{
    37  		Detail: detail,
    38  	}
    39  }
    40  
    41  // String returns the errors internal detail string
    42  func (e *Error) String() string {
    43  	return e.Detail
    44  }
    45  
    46  // FromFieldError sets the error detail from the provided field error
    47  func (e *Error) FromFieldError(fe validator.FieldError) {
    48  	e.Detail = NewFieldErrorDetail(fe)
    49  }
    50  
    51  // NewFieldErrorDetail returns an error detail message appropriate for the
    52  // provided field error
    53  func NewFieldErrorDetail(fe validator.FieldError) string {
    54  	switch fe.Tag() {
    55  	case "required":
    56  		return NewRequiredFieldMessage(fe.Field())
    57  	case "hostname_rfc1123":
    58  		return NewInvalidRFC1123HostnameMessage(fe.Field())
    59  	}
    60  	return fe.Error()
    61  }
    62  
    63  // NewReadOnlyFieldMessage returns a new read-only field error detail string for
    64  // the provided field
    65  func NewReadOnlyFieldMessage(field string) string {
    66  	return NewMessage(field, ReadOnlyFieldMessage)
    67  }
    68  
    69  // NewRequiredFieldMessage returns a new required field error detail string for
    70  // the provided field
    71  func NewRequiredFieldMessage(field string) string {
    72  	return NewMessage(field, RequiredFieldMessage)
    73  }
    74  
    75  // NewValidRFC1123HostnameMessage returns a new invalid RFC1123 hostname field
    76  // error detail string for the provided field
    77  func NewInvalidRFC1123HostnameMessage(field string) string {
    78  	return NewMessage(field, InvalidRFC1123HostnameMessage)
    79  }
    80  
    81  // NewMessage returns a new detail string combining the provided field and
    82  // message
    83  func NewMessage(field, message string) string {
    84  	return strings.Join([]string{field, message}, " ")
    85  }
    86  

View as plain text