-
Notifications
You must be signed in to change notification settings - Fork 3
/
image_meta.go
125 lines (103 loc) · 2.32 KB
/
image_meta.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package validator
import (
"context"
"slices"
"strings"
)
const (
ImageMimeTypePNG = "image/png"
ImageMimeTypeJPG = "image/jpeg"
ImageMimeTypeGIF = "image/gif"
)
type ImageMetaData struct {
Name string
MimeType string
Size uint64
Width int
Height int
}
type ImageMeta struct {
message string
invalidMimeTypeMessage string
tooLongSizeMessage string
mimeTypes []string
maxFileSizeBytes uint64
whenFunc WhenFunc
skipEmpty bool
skipError bool
}
func NewImageMeta() *ImageMeta {
return &ImageMeta{
message: "This value must be a ImageMetaData struct.",
invalidMimeTypeMessage: "MimeType must be a equal one of [{mimeTypes}].",
tooLongSizeMessage: "File size must be greater than {maxFileSizeBytes} bytes.",
mimeTypes: []string{
ImageMimeTypeJPG,
ImageMimeTypePNG,
},
maxFileSizeBytes: 0, // no limit
}
}
func (r *ImageMeta) WithMessage(message string) *ImageMeta {
rc := *r
rc.message = message
return &rc
}
func (r *ImageMeta) When(v WhenFunc) *ImageMeta {
rc := *r
rc.whenFunc = v
return &rc
}
func (r *ImageMeta) when() WhenFunc {
return r.whenFunc
}
func (r *ImageMeta) setWhen(v WhenFunc) {
r.whenFunc = v
}
func (r *ImageMeta) SkipOnEmpty() *ImageMeta {
rc := *r
rc.skipEmpty = true
return &rc
}
func (r *ImageMeta) skipOnEmpty() bool {
return r.skipEmpty
}
func (r *ImageMeta) setSkipOnEmpty(v bool) {
r.skipEmpty = v
}
func (r *ImageMeta) SkipOnError() *ImageMeta {
rs := *r
rs.skipError = true
return &rs
}
func (r *ImageMeta) shouldSkipOnError() bool {
return r.skipError
}
func (r *ImageMeta) setSkipOnError(v bool) {
r.skipError = v
}
func (r *ImageMeta) ValidateValue(_ context.Context, value any) error {
meta, ok := value.(*ImageMetaData)
if !ok {
return NewResult().WithError(NewValidationError(r.message))
}
if !slices.Contains(r.mimeTypes, meta.MimeType) {
return NewResult().
WithError(
NewValidationError(r.invalidMimeTypeMessage).
WithParams(map[string]any{
"mimeTypes": strings.Join(r.mimeTypes, ", "),
}),
)
}
if meta.Size > r.maxFileSizeBytes {
return NewResult().
WithError(
NewValidationError(r.tooLongSizeMessage).
WithParams(map[string]any{
"maxFileSizeBytes": r.maxFileSizeBytes,
}),
)
}
return nil
}