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