...
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
17 func NewErrorResponse(errors ...*Error) gin.H {
18 return gin.H{
19 "errors": errors,
20 }
21 }
22
23
24
25
26 type Error struct {
27
28
29
30
31 Detail string `json:"detail"`
32 }
33
34
35 func NewError(detail string) *Error {
36 return &Error{
37 Detail: detail,
38 }
39 }
40
41
42 func (e *Error) String() string {
43 return e.Detail
44 }
45
46
47 func (e *Error) FromFieldError(fe validator.FieldError) {
48 e.Detail = NewFieldErrorDetail(fe)
49 }
50
51
52
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
64
65 func NewReadOnlyFieldMessage(field string) string {
66 return NewMessage(field, ReadOnlyFieldMessage)
67 }
68
69
70
71 func NewRequiredFieldMessage(field string) string {
72 return NewMessage(field, RequiredFieldMessage)
73 }
74
75
76
77 func NewInvalidRFC1123HostnameMessage(field string) string {
78 return NewMessage(field, InvalidRFC1123HostnameMessage)
79 }
80
81
82
83 func NewMessage(field, message string) string {
84 return strings.Join([]string{field, message}, " ")
85 }
86
View as plain text