This repository has been archived by the owner on May 28, 2023. It is now read-only.
/
tag_bytes.go
78 lines (68 loc) · 2.68 KB
/
tag_bytes.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
package govalidator
import (
"fmt"
"reflect"
"github.com/yu31/protoc-plugin/xgo/pb/pbvalidator"
"github.com/yu31/protoc-plugin/xgo/pkg/protovalidator"
"google.golang.org/protobuf/compiler/protogen"
)
func (p *plugin) loadBytesTags(field *protogen.Field, tagOptions *pbvalidator.TagOptions) *pbvalidator.BytesTags {
if tagOptions == nil || tagOptions.Kind == nil {
return nil
}
switch ot := tagOptions.Kind.(type) {
case *pbvalidator.TagOptions_Bytes:
return ot.Bytes
default:
p.exitWithMsg(
"%s: types <bytes> only support the kind of TagOptions <bytes>; and you provided: <%s>",
p.buildIdentifierWithField(field), reflect.TypeOf(ot).Elem().Name(),
)
}
return nil
}
func (p *plugin) processBytesTags(fieldInfo *FieldInfo) []*protovalidator.TagInfo {
options := p.loadBytesTags(fieldInfo.Field, fieldInfo.TagOptions)
if options == nil {
return nil
}
itemName := p.getGoItemName(fieldInfo.Field)
var tagInfos []*protovalidator.TagInfo
var cond string
getFieldValue := func() string {
convertMethod := p.g.QualifiedGoIdent(strconvPackage.Ident("Itoa"))
filedValue := fmt.Sprintf("%s(len(%s))", convertMethod, itemName)
return filedValue
}
if options.LenEq != nil {
value := *options.LenEq
cond = fmt.Sprintf("len(%s) == %d", itemName, value)
tagInfos = append(tagInfos, &protovalidator.TagInfo{Tag: protovalidator.TagBytesLenEq, Cond: cond, Value: value, FieldValue: getFieldValue()})
}
if options.LenNe != nil {
value := *options.LenNe
cond = fmt.Sprintf("len(%s) != %d", itemName, value)
tagInfos = append(tagInfos, &protovalidator.TagInfo{Tag: protovalidator.TagBytesLenNe, Cond: cond, Value: value, FieldValue: getFieldValue()})
}
if options.LenGt != nil {
value := *options.LenGt
cond = fmt.Sprintf("len(%s) > %d", itemName, value)
tagInfos = append(tagInfos, &protovalidator.TagInfo{Tag: protovalidator.TagBytesLenGt, Cond: cond, Value: value, FieldValue: getFieldValue()})
}
if options.LenLt != nil {
value := *options.LenLt
cond = fmt.Sprintf("len(%s) < %d", itemName, value)
tagInfos = append(tagInfos, &protovalidator.TagInfo{Tag: protovalidator.TagBytesLenLt, Cond: cond, Value: value, FieldValue: getFieldValue()})
}
if options.LenGte != nil {
value := *options.LenGte
cond = fmt.Sprintf("len(%s) >= %d", itemName, value)
tagInfos = append(tagInfos, &protovalidator.TagInfo{Tag: protovalidator.TagBytesLenGte, Cond: cond, Value: value, FieldValue: getFieldValue()})
}
if options.LenLte != nil {
value := *options.LenLte
cond = fmt.Sprintf("len(%s) <= %d", itemName, value)
tagInfos = append(tagInfos, &protovalidator.TagInfo{Tag: protovalidator.TagBytesLenLte, Cond: cond, Value: value, FieldValue: getFieldValue()})
}
return tagInfos
}