@@ -23,21 +23,12 @@ import (
23
23
kalerrors "sigs.k8s.io/kube-api-linter/pkg/analysis/errors"
24
24
"sigs.k8s.io/kube-api-linter/pkg/analysis/helpers/extractjsontags"
25
25
"sigs.k8s.io/kube-api-linter/pkg/analysis/helpers/inspector"
26
- "sigs.k8s.io/kube-api-linter/pkg/analysis/helpers/markers"
26
+ markershelper "sigs.k8s.io/kube-api-linter/pkg/analysis/helpers/markers"
27
+ "sigs.k8s.io/kube-api-linter/pkg/markers"
27
28
)
28
29
29
30
const (
30
31
name = "maxlength"
31
-
32
- kubebuilderMaxLength = "kubebuilder:validation:MaxLength"
33
- kubebuilderEnum = "kubebuilder:validation:Enum"
34
- kubebuilderFormat = "kubebuilder:validation:Format"
35
-
36
- kubebuilderItemsMaxLength = "kubebuilder:validation:items:MaxLength"
37
- kubebuilderItemsEnum = "kubebuilder:validation:items:Enum"
38
- kubebuilderItemsFormat = "kubebuilder:validation:items:Format"
39
-
40
- kubebuilderMaxItems = "kubebuilder:validation:MaxItems"
41
32
)
42
33
43
34
// Analyzer is the analyzer for the maxlength package.
@@ -55,25 +46,25 @@ func run(pass *analysis.Pass) (interface{}, error) {
55
46
return nil , kalerrors .ErrCouldNotGetInspector
56
47
}
57
48
58
- inspect .InspectFields (func (field * ast.Field , stack []ast.Node , jsonTagInfo extractjsontags.FieldTagInfo , markersAccess markers .Markers ) {
49
+ inspect .InspectFields (func (field * ast.Field , stack []ast.Node , jsonTagInfo extractjsontags.FieldTagInfo , markersAccess markershelper .Markers ) {
59
50
checkField (pass , field , markersAccess )
60
51
})
61
52
62
53
return nil , nil //nolint:nilnil
63
54
}
64
55
65
- func checkField (pass * analysis.Pass , field * ast.Field , markersAccess markers .Markers ) {
56
+ func checkField (pass * analysis.Pass , field * ast.Field , markersAccess markershelper .Markers ) {
66
57
if len (field .Names ) == 0 || field .Names [0 ] == nil {
67
58
return
68
59
}
69
60
70
61
fieldName := field .Names [0 ].Name
71
62
prefix := fmt .Sprintf ("field %s" , fieldName )
72
63
73
- checkTypeExpr (pass , field .Type , field , nil , markersAccess , prefix , kubebuilderMaxLength , needsStringMaxLength )
64
+ checkTypeExpr (pass , field .Type , field , nil , markersAccess , prefix , markers . KubebuilderMaxLengthMarker , needsStringMaxLength )
74
65
}
75
66
76
- func checkIdent (pass * analysis.Pass , ident * ast.Ident , node ast.Node , aliases []* ast.TypeSpec , markersAccess markers .Markers , prefix , marker string , needsMaxLength func (markers .MarkerSet ) bool ) {
67
+ func checkIdent (pass * analysis.Pass , ident * ast.Ident , node ast.Node , aliases []* ast.TypeSpec , markersAccess markershelper .Markers , prefix , marker string , needsMaxLength func (markershelper .MarkerSet ) bool ) {
77
68
if ident .Obj == nil { // Built-in type
78
69
checkString (pass , ident , node , aliases , markersAccess , prefix , marker , needsMaxLength )
79
70
@@ -88,7 +79,7 @@ func checkIdent(pass *analysis.Pass, ident *ast.Ident, node ast.Node, aliases []
88
79
checkTypeSpec (pass , tSpec , node , append (aliases , tSpec ), markersAccess , fmt .Sprintf ("%s type" , prefix ), marker , needsMaxLength )
89
80
}
90
81
91
- func checkString (pass * analysis.Pass , ident * ast.Ident , node ast.Node , aliases []* ast.TypeSpec , markersAccess markers .Markers , prefix , marker string , needsMaxLength func (markers .MarkerSet ) bool ) {
82
+ func checkString (pass * analysis.Pass , ident * ast.Ident , node ast.Node , aliases []* ast.TypeSpec , markersAccess markershelper .Markers , prefix , marker string , needsMaxLength func (markershelper .MarkerSet ) bool ) {
92
83
if ident .Name != "string" {
93
84
return
94
85
}
@@ -100,7 +91,7 @@ func checkString(pass *analysis.Pass, ident *ast.Ident, node ast.Node, aliases [
100
91
}
101
92
}
102
93
103
- func checkTypeSpec (pass * analysis.Pass , tSpec * ast.TypeSpec , node ast.Node , aliases []* ast.TypeSpec , markersAccess markers .Markers , prefix , marker string , needsMaxLength func (markers .MarkerSet ) bool ) {
94
+ func checkTypeSpec (pass * analysis.Pass , tSpec * ast.TypeSpec , node ast.Node , aliases []* ast.TypeSpec , markersAccess markershelper .Markers , prefix , marker string , needsMaxLength func (markershelper .MarkerSet ) bool ) {
104
95
if tSpec .Name == nil {
105
96
return
106
97
}
@@ -111,7 +102,7 @@ func checkTypeSpec(pass *analysis.Pass, tSpec *ast.TypeSpec, node ast.Node, alia
111
102
checkTypeExpr (pass , tSpec .Type , node , aliases , markersAccess , prefix , marker , needsMaxLength )
112
103
}
113
104
114
- func checkTypeExpr (pass * analysis.Pass , typeExpr ast.Expr , node ast.Node , aliases []* ast.TypeSpec , markersAccess markers .Markers , prefix , marker string , needsMaxLength func (markers .MarkerSet ) bool ) {
105
+ func checkTypeExpr (pass * analysis.Pass , typeExpr ast.Expr , node ast.Node , aliases []* ast.TypeSpec , markersAccess markershelper .Markers , prefix , marker string , needsMaxLength func (markershelper .MarkerSet ) bool ) {
115
106
switch typ := typeExpr .(type ) {
116
107
case * ast.Ident :
117
108
checkIdent (pass , typ , node , aliases , markersAccess , prefix , marker , needsMaxLength )
@@ -122,7 +113,7 @@ func checkTypeExpr(pass *analysis.Pass, typeExpr ast.Expr, node ast.Node, aliase
122
113
}
123
114
}
124
115
125
- func checkArrayType (pass * analysis.Pass , arrayType * ast.ArrayType , node ast.Node , aliases []* ast.TypeSpec , markersAccess markers .Markers , prefix string ) {
116
+ func checkArrayType (pass * analysis.Pass , arrayType * ast.ArrayType , node ast.Node , aliases []* ast.TypeSpec , markersAccess markershelper .Markers , prefix string ) {
126
117
if arrayType .Elt != nil {
127
118
if ident , ok := arrayType .Elt .(* ast.Ident ); ok {
128
119
if ident .Name == "byte" {
@@ -132,7 +123,7 @@ func checkArrayType(pass *analysis.Pass, arrayType *ast.ArrayType, node ast.Node
132
123
NamePos : ident .NamePos ,
133
124
Name : "string" ,
134
125
}
135
- checkString (pass , i , node , aliases , markersAccess , prefix , kubebuilderMaxLength , needsStringMaxLength )
126
+ checkString (pass , i , node , aliases , markersAccess , prefix , markers . KubebuilderMaxLengthMarker , needsStringMaxLength )
136
127
137
128
return
138
129
}
@@ -141,16 +132,16 @@ func checkArrayType(pass *analysis.Pass, arrayType *ast.ArrayType, node ast.Node
141
132
}
142
133
}
143
134
144
- markers := getCombinedMarkers (markersAccess , node , aliases )
135
+ markerSet := getCombinedMarkers (markersAccess , node , aliases )
145
136
146
- if ! markers .Has (kubebuilderMaxItems ) {
147
- pass .Reportf (node .Pos (), "%s must have a maximum items, add %s marker" , prefix , kubebuilderMaxItems )
137
+ if ! markerSet .Has (markers . KubebuilderMaxItemsMarker ) {
138
+ pass .Reportf (node .Pos (), "%s must have a maximum items, add %s marker" , prefix , markers . KubebuilderMaxItemsMarker )
148
139
}
149
140
}
150
141
151
- func checkArrayElementIdent (pass * analysis.Pass , ident * ast.Ident , node ast.Node , aliases []* ast.TypeSpec , markersAccess markers .Markers , prefix string ) {
142
+ func checkArrayElementIdent (pass * analysis.Pass , ident * ast.Ident , node ast.Node , aliases []* ast.TypeSpec , markersAccess markershelper .Markers , prefix string ) {
152
143
if ident .Obj == nil { // Built-in type
153
- checkString (pass , ident , node , aliases , markersAccess , prefix , kubebuilderItemsMaxLength , needsItemsMaxLength )
144
+ checkString (pass , ident , node , aliases , markersAccess , prefix , markers . KubebuilderItemsMaxLengthMarker , needsItemsMaxLength )
154
145
155
146
return
156
147
}
@@ -162,13 +153,13 @@ func checkArrayElementIdent(pass *analysis.Pass, ident *ast.Ident, node ast.Node
162
153
163
154
// If the array element wasn't directly a string, allow a string alias to be used
164
155
// with either the items style markers or the on alias style markers.
165
- checkTypeSpec (pass , tSpec , node , append (aliases , tSpec ), markersAccess , fmt .Sprintf ("%s type" , prefix ), kubebuilderMaxLength , func (ms markers .MarkerSet ) bool {
156
+ checkTypeSpec (pass , tSpec , node , append (aliases , tSpec ), markersAccess , fmt .Sprintf ("%s type" , prefix ), markers . KubebuilderMaxLengthMarker , func (ms markershelper .MarkerSet ) bool {
166
157
return needsStringMaxLength (ms ) && needsItemsMaxLength (ms )
167
158
})
168
159
}
169
160
170
- func getCombinedMarkers (markersAccess markers .Markers , node ast.Node , aliases []* ast.TypeSpec ) markers .MarkerSet {
171
- base := markers .NewMarkerSet (getMarkers (markersAccess , node ).UnsortedList ()... )
161
+ func getCombinedMarkers (markersAccess markershelper .Markers , node ast.Node , aliases []* ast.TypeSpec ) markershelper .MarkerSet {
162
+ base := markershelper .NewMarkerSet (getMarkers (markersAccess , node ).UnsortedList ()... )
172
163
173
164
for _ , a := range aliases {
174
165
base .Insert (getMarkers (markersAccess , a ).UnsortedList ()... )
@@ -177,7 +168,7 @@ func getCombinedMarkers(markersAccess markers.Markers, node ast.Node, aliases []
177
168
return base
178
169
}
179
170
180
- func getMarkers (markersAccess markers .Markers , node ast.Node ) markers .MarkerSet {
171
+ func getMarkers (markersAccess markershelper .Markers , node ast.Node ) markershelper .MarkerSet {
181
172
switch t := node .(type ) {
182
173
case * ast.Field :
183
174
return markersAccess .FieldMarkers (t )
@@ -191,10 +182,10 @@ func getMarkers(markersAccess markers.Markers, node ast.Node) markers.MarkerSet
191
182
// needsMaxLength returns true if the field needs a maximum length.
192
183
// Fields do not need a maximum length if they are already marked with a maximum length,
193
184
// or if they are an enum, or if they are a date, date-time or duration.
194
- func needsStringMaxLength (markerSet markers .MarkerSet ) bool {
185
+ func needsStringMaxLength (markerSet markershelper .MarkerSet ) bool {
195
186
switch {
196
- case markerSet .Has (kubebuilderMaxLength ),
197
- markerSet .Has (kubebuilderEnum ),
187
+ case markerSet .Has (markers . KubebuilderMaxLengthMarker ),
188
+ markerSet .Has (markers . KubebuilderEnumMarker ),
198
189
markerSet .HasWithValue (kubebuilderFormatWithValue ("date" )),
199
190
markerSet .HasWithValue (kubebuilderFormatWithValue ("date-time" )),
200
191
markerSet .HasWithValue (kubebuilderFormatWithValue ("duration" )):
@@ -204,10 +195,10 @@ func needsStringMaxLength(markerSet markers.MarkerSet) bool {
204
195
return true
205
196
}
206
197
207
- func needsItemsMaxLength (markerSet markers .MarkerSet ) bool {
198
+ func needsItemsMaxLength (markerSet markershelper .MarkerSet ) bool {
208
199
switch {
209
- case markerSet .Has (kubebuilderItemsMaxLength ),
210
- markerSet .Has (kubebuilderItemsEnum ),
200
+ case markerSet .Has (markers . KubebuilderItemsMaxLengthMarker ),
201
+ markerSet .Has (markers . KubebuilderItemsEnumMarker ),
211
202
markerSet .HasWithValue (kubebuilderItemsFormatWithValue ("date" )),
212
203
markerSet .HasWithValue (kubebuilderItemsFormatWithValue ("date-time" )),
213
204
markerSet .HasWithValue (kubebuilderItemsFormatWithValue ("duration" )):
@@ -218,9 +209,9 @@ func needsItemsMaxLength(markerSet markers.MarkerSet) bool {
218
209
}
219
210
220
211
func kubebuilderFormatWithValue (value string ) string {
221
- return fmt .Sprintf ("%s:=%s" , kubebuilderFormat , value )
212
+ return fmt .Sprintf ("%s:=%s" , markers . KubebuilderFormatMarker , value )
222
213
}
223
214
224
215
func kubebuilderItemsFormatWithValue (value string ) string {
225
- return fmt .Sprintf ("%s:=%s" , kubebuilderItemsFormat , value )
216
+ return fmt .Sprintf ("%s:=%s" , markers . KubebuilderItemsFormatMarker , value )
226
217
}
0 commit comments