-
Notifications
You must be signed in to change notification settings - Fork 248
/
buflintbuild.go
359 lines (354 loc) · 14.7 KB
/
buflintbuild.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
// Copyright 2020-2023 Buf Technologies, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Package buflintbuild contains the RuleBuilders used by buflintv*.
package buflintbuild
import (
"errors"
"github.com/bufbuild/buf/private/bufpkg/bufanalysis"
"github.com/bufbuild/buf/private/bufpkg/bufcheck/buflint/internal/buflintcheck"
"github.com/bufbuild/buf/private/bufpkg/bufcheck/internal"
"github.com/bufbuild/buf/private/pkg/protosource"
)
var (
// CommentEnumRuleBuilder is a rule builder.
CommentEnumRuleBuilder = internal.NewNopRuleBuilder(
"COMMENT_ENUM",
"enums have non-empty comments",
newAdapter(buflintcheck.CheckCommentEnum),
)
// CommentEnumValueRuleBuilder is a rule builder.
CommentEnumValueRuleBuilder = internal.NewNopRuleBuilder(
"COMMENT_ENUM_VALUE",
"enum values have non-empty comments",
newAdapter(buflintcheck.CheckCommentEnumValue),
)
// CommentFieldRuleBuilder is a rule builder.
CommentFieldRuleBuilder = internal.NewNopRuleBuilder(
"COMMENT_FIELD",
"fields have non-empty comments",
newAdapter(buflintcheck.CheckCommentField),
)
// CommentMessageRuleBuilder is a rule builder.
CommentMessageRuleBuilder = internal.NewNopRuleBuilder(
"COMMENT_MESSAGE",
"messages have non-empty comments",
newAdapter(buflintcheck.CheckCommentMessage),
)
// CommentOneofRuleBuilder is a rule builder.
CommentOneofRuleBuilder = internal.NewNopRuleBuilder(
"COMMENT_ONEOF",
"oneof have non-empty comments",
newAdapter(buflintcheck.CheckCommentOneof),
)
// CommentRPCRuleBuilder is a rule builder.
CommentRPCRuleBuilder = internal.NewNopRuleBuilder(
"COMMENT_RPC",
"RPCs have non-empty comments",
newAdapter(buflintcheck.CheckCommentRPC),
)
// CommentServiceRuleBuilder is a rule builder.
CommentServiceRuleBuilder = internal.NewNopRuleBuilder(
"COMMENT_SERVICE",
"services have non-empty comments",
newAdapter(buflintcheck.CheckCommentService),
)
// DirectorySamePackageRuleBuilder is a rule builder.
DirectorySamePackageRuleBuilder = internal.NewNopRuleBuilder(
"DIRECTORY_SAME_PACKAGE",
"all files in a given directory are in the same package",
newAdapter(buflintcheck.CheckDirectorySamePackage),
)
// EnumFirstValueZeroRuleBuilder is a rule builder.
EnumFirstValueZeroRuleBuilder = internal.NewNopRuleBuilder(
"ENUM_FIRST_VALUE_ZERO",
"all first values of enums have a numeric value of 0",
newAdapter(buflintcheck.CheckEnumFirstValueZero),
)
// EnumNoAllowAliasRuleBuilder is a rule builder.
EnumNoAllowAliasRuleBuilder = internal.NewNopRuleBuilder(
"ENUM_NO_ALLOW_ALIAS",
"enums do not have the allow_alias option set",
newAdapter(buflintcheck.CheckEnumNoAllowAlias),
)
// EnumPascalCaseRuleBuilder is a rule builder.
EnumPascalCaseRuleBuilder = internal.NewNopRuleBuilder(
"ENUM_PASCAL_CASE",
"enums are PascalCase",
newAdapter(buflintcheck.CheckEnumPascalCase),
)
// EnumValuePrefixRuleBuilder is a rule builder.
EnumValuePrefixRuleBuilder = internal.NewNopRuleBuilder(
"ENUM_VALUE_PREFIX",
"enum values are prefixed with ENUM_NAME_UPPER_SNAKE_CASE",
newAdapter(buflintcheck.CheckEnumValuePrefix),
)
// EnumValueUpperSnakeCaseRuleBuilder is a rule builder.
EnumValueUpperSnakeCaseRuleBuilder = internal.NewNopRuleBuilder(
"ENUM_VALUE_UPPER_SNAKE_CASE",
"enum values are UPPER_SNAKE_CASE",
newAdapter(buflintcheck.CheckEnumValueUpperSnakeCase),
)
// EnumZeroValueSuffixRuleBuilder is a rule builder.
EnumZeroValueSuffixRuleBuilder = internal.NewRuleBuilder(
"ENUM_ZERO_VALUE_SUFFIX",
func(configBuilder internal.ConfigBuilder) (string, error) {
if configBuilder.EnumZeroValueSuffix == "" {
return "", errors.New("enum_zero_value_suffix is empty")
}
return "enum zero values are suffixed with " + configBuilder.EnumZeroValueSuffix + " (suffix is configurable)", nil
},
func(configBuilder internal.ConfigBuilder) (internal.CheckFunc, error) {
if configBuilder.EnumZeroValueSuffix == "" {
return nil, errors.New("enum_zero_value_suffix is empty")
}
return internal.CheckFunc(func(id string, ignoreFunc internal.IgnoreFunc, _ []protosource.File, files []protosource.File) ([]bufanalysis.FileAnnotation, error) {
return buflintcheck.CheckEnumZeroValueSuffix(id, ignoreFunc, files, configBuilder.EnumZeroValueSuffix)
}), nil
},
)
// FieldLowerSnakeCaseRuleBuilder is a rule builder.
FieldLowerSnakeCaseRuleBuilder = internal.NewNopRuleBuilder(
"FIELD_LOWER_SNAKE_CASE",
"field names are lower_snake_case",
newAdapter(buflintcheck.CheckFieldLowerSnakeCase),
)
// FieldNoDescriptorRuleBuilder is a rule builder.
FieldNoDescriptorRuleBuilder = internal.NewNopRuleBuilder(
"FIELD_NO_DESCRIPTOR",
`field names are not name capitalization of "descriptor" with any number of prefix or suffix underscores`,
newAdapter(buflintcheck.CheckFieldNoDescriptor),
)
// FileLowerSnakeCaseRuleBuilder is a rule builder.
FileLowerSnakeCaseRuleBuilder = internal.NewNopRuleBuilder(
"FILE_LOWER_SNAKE_CASE",
"filenames are lower_snake_case",
newAdapter(buflintcheck.CheckFileLowerSnakeCase),
)
// ImportNoPublicRuleBuilder is a rule builder.
ImportNoPublicRuleBuilder = internal.NewNopRuleBuilder(
"IMPORT_NO_PUBLIC",
"imports are not public",
newAdapter(buflintcheck.CheckImportNoPublic),
)
// ImportNoWeakRuleBuilder is a rule builder.
ImportNoWeakRuleBuilder = internal.NewNopRuleBuilder(
"IMPORT_NO_WEAK",
"imports are not weak",
newAdapter(buflintcheck.CheckImportNoWeak),
)
// ImportUsedRuleBuilder is a rule builder.
ImportUsedRuleBuilder = internal.NewNopRuleBuilder(
"IMPORT_USED",
"imports are used",
newAdapter(buflintcheck.CheckImportUsed),
)
// MessagePascalCaseRuleBuilder is a rule builder.
MessagePascalCaseRuleBuilder = internal.NewNopRuleBuilder(
"MESSAGE_PASCAL_CASE",
"messages are PascalCase",
newAdapter(buflintcheck.CheckMessagePascalCase),
)
// OneofLowerSnakeCaseRuleBuilder is a rule builder.
OneofLowerSnakeCaseRuleBuilder = internal.NewNopRuleBuilder(
"ONEOF_LOWER_SNAKE_CASE",
"oneof names are lower_snake_case",
newAdapter(buflintcheck.CheckOneofLowerSnakeCase),
)
// PackageDefinedRuleBuilder is a rule builder.
PackageDefinedRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_DEFINED",
"all files have a package defined",
newAdapter(buflintcheck.CheckPackageDefined),
)
// PackageDirectoryMatchRuleBuilder is a rule builder.
PackageDirectoryMatchRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_DIRECTORY_MATCH",
"all files are in a directory that matches their package name",
newAdapter(buflintcheck.CheckPackageDirectoryMatch),
)
// PackageLowerSnakeCaseRuleBuilder is a rule builder.
PackageLowerSnakeCaseRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_LOWER_SNAKE_CASE",
"packages are lower_snake.case",
newAdapter(buflintcheck.CheckPackageLowerSnakeCase),
)
// PackageNoImportCycleRuleBuilder is a rule builder.
PackageNoImportCycleRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_NO_IMPORT_CYCLE",
"packages do not have import cycles",
newAdapter(buflintcheck.CheckPackageNoImportCycle),
)
// PackageSameCsharpNamespaceRuleBuilder is a rule builder.
PackageSameCsharpNamespaceRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_SAME_CSHARP_NAMESPACE",
"all files with a given package have the same value for the csharp_namespace option",
newAdapter(buflintcheck.CheckPackageSameCsharpNamespace),
)
// PackageSameDirectoryRuleBuilder is a rule builder.
PackageSameDirectoryRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_SAME_DIRECTORY",
"all files with a given package are in the same directory",
newAdapter(buflintcheck.CheckPackageSameDirectory),
)
// PackageSameGoPackageRuleBuilder is a rule builder.
PackageSameGoPackageRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_SAME_GO_PACKAGE",
"all files with a given package have the same value for the go_package option",
newAdapter(buflintcheck.CheckPackageSameGoPackage),
)
// PackageSameJavaMultipleFilesRuleBuilder is a rule builder.
PackageSameJavaMultipleFilesRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_SAME_JAVA_MULTIPLE_FILES",
"all files with a given package have the same value for the java_multiple_files option",
newAdapter(buflintcheck.CheckPackageSameJavaMultipleFiles),
)
// PackageSameJavaPackageRuleBuilder is a rule builder.
PackageSameJavaPackageRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_SAME_JAVA_PACKAGE",
"all files with a given package have the same value for the java_package option",
newAdapter(buflintcheck.CheckPackageSameJavaPackage),
)
// PackageSamePhpNamespaceRuleBuilder is a rule builder.
PackageSamePhpNamespaceRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_SAME_PHP_NAMESPACE",
"all files with a given package have the same value for the php_namespace option",
newAdapter(buflintcheck.CheckPackageSamePhpNamespace),
)
// PackageSameRubyPackageRuleBuilder is a rule builder.
PackageSameRubyPackageRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_SAME_RUBY_PACKAGE",
"all files with a given package have the same value for the ruby_package option",
newAdapter(buflintcheck.CheckPackageSameRubyPackage),
)
// PackageSameSwiftPrefixRuleBuilder is a rule builder.
PackageSameSwiftPrefixRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_SAME_SWIFT_PREFIX",
"all files with a given package have the same value for the swift_prefix option",
newAdapter(buflintcheck.CheckPackageSameSwiftPrefix),
)
// PackageVersionSuffixRuleBuilder is a rule builder.
PackageVersionSuffixRuleBuilder = internal.NewNopRuleBuilder(
"PACKAGE_VERSION_SUFFIX",
`the last component of all packages is a version of the form v\d+, v\d+test.*, v\d+(alpha|beta)\d+, or v\d+p\d+(alpha|beta)\d+, where numbers are >=1`,
newAdapter(buflintcheck.CheckPackageVersionSuffix),
)
// RPCNoClientStreamingRuleBuilder is a rule builder.
RPCNoClientStreamingRuleBuilder = internal.NewNopRuleBuilder(
"RPC_NO_CLIENT_STREAMING",
"RPCs are not client streaming",
newAdapter(buflintcheck.CheckRPCNoClientStreaming),
)
// RPCNoServerStreamingRuleBuilder is a rule builder.
RPCNoServerStreamingRuleBuilder = internal.NewNopRuleBuilder(
"RPC_NO_SERVER_STREAMING",
"RPCs are not server streaming",
newAdapter(buflintcheck.CheckRPCNoServerStreaming),
)
// RPCPascalCaseRuleBuilder is a rule builder.
RPCPascalCaseRuleBuilder = internal.NewNopRuleBuilder(
"RPC_PASCAL_CASE",
"RPCs are PascalCase",
newAdapter(buflintcheck.CheckRPCPascalCase),
)
// RPCRequestResponseUniqueRuleBuilder is a rule builder.
RPCRequestResponseUniqueRuleBuilder = internal.NewRuleBuilder(
"RPC_REQUEST_RESPONSE_UNIQUE",
func(configBuilder internal.ConfigBuilder) (string, error) {
return "RPC request and response types are only used in one RPC (configurable)", nil
},
func(configBuilder internal.ConfigBuilder) (internal.CheckFunc, error) {
return internal.CheckFunc(func(id string, ignoreFunc internal.IgnoreFunc, _ []protosource.File, files []protosource.File) ([]bufanalysis.FileAnnotation, error) {
return buflintcheck.CheckRPCRequestResponseUnique(
id,
ignoreFunc,
files,
configBuilder.RPCAllowSameRequestResponse,
configBuilder.RPCAllowGoogleProtobufEmptyRequests,
configBuilder.RPCAllowGoogleProtobufEmptyResponses,
)
}), nil
},
)
// RPCRequestStandardNameRuleBuilder is a rule builder.
RPCRequestStandardNameRuleBuilder = internal.NewRuleBuilder(
"RPC_REQUEST_STANDARD_NAME",
func(configBuilder internal.ConfigBuilder) (string, error) {
return "RPC request type names are RPCNameRequest or ServiceNameRPCNameRequest (configurable)", nil
},
func(configBuilder internal.ConfigBuilder) (internal.CheckFunc, error) {
return internal.CheckFunc(func(id string, ignoreFunc internal.IgnoreFunc, _ []protosource.File, files []protosource.File) ([]bufanalysis.FileAnnotation, error) {
return buflintcheck.CheckRPCRequestStandardName(
id,
ignoreFunc,
files,
configBuilder.RPCAllowGoogleProtobufEmptyRequests,
)
}), nil
},
)
// RPCResponseStandardNameRuleBuilder is a rule builder.
RPCResponseStandardNameRuleBuilder = internal.NewRuleBuilder(
"RPC_RESPONSE_STANDARD_NAME",
func(configBuilder internal.ConfigBuilder) (string, error) {
return "RPC response type names are RPCNameResponse or ServiceNameRPCNameResponse (configurable)", nil
},
func(configBuilder internal.ConfigBuilder) (internal.CheckFunc, error) {
return internal.CheckFunc(func(id string, ignoreFunc internal.IgnoreFunc, _ []protosource.File, files []protosource.File) ([]bufanalysis.FileAnnotation, error) {
return buflintcheck.CheckRPCResponseStandardName(
id,
ignoreFunc,
files,
configBuilder.RPCAllowGoogleProtobufEmptyResponses,
)
}), nil
},
)
// ServicePascalCaseRuleBuilder is a rule builder.
ServicePascalCaseRuleBuilder = internal.NewNopRuleBuilder(
"SERVICE_PASCAL_CASE",
"services are PascalCase",
newAdapter(buflintcheck.CheckServicePascalCase),
)
// ServiceSuffixRuleBuilder is a rule builder.
ServiceSuffixRuleBuilder = internal.NewRuleBuilder(
"SERVICE_SUFFIX",
func(configBuilder internal.ConfigBuilder) (string, error) {
if configBuilder.ServiceSuffix == "" {
return "", errors.New("service_suffix is empty")
}
return "services are suffixed with " + configBuilder.ServiceSuffix + " (suffix is configurable)", nil
},
func(configBuilder internal.ConfigBuilder) (internal.CheckFunc, error) {
if configBuilder.ServiceSuffix == "" {
return nil, errors.New("service_suffix is empty")
}
return internal.CheckFunc(func(id string, ignoreFunc internal.IgnoreFunc, _ []protosource.File, files []protosource.File) ([]bufanalysis.FileAnnotation, error) {
return buflintcheck.CheckServiceSuffix(id, ignoreFunc, files, configBuilder.ServiceSuffix)
}), nil
},
)
// SyntaxSpecifiedRuleBuilder is a rule builder.
SyntaxSpecifiedRuleBuilder = internal.NewNopRuleBuilder(
"SYNTAX_SPECIFIED",
"all files have a syntax specified",
newAdapter(buflintcheck.CheckSyntaxSpecified),
)
)
func newAdapter(
f func(string, internal.IgnoreFunc, []protosource.File) ([]bufanalysis.FileAnnotation, error),
) func(string, internal.IgnoreFunc, []protosource.File, []protosource.File) ([]bufanalysis.FileAnnotation, error) {
return func(id string, ignoreFunc internal.IgnoreFunc, _ []protosource.File, files []protosource.File) ([]bufanalysis.FileAnnotation, error) {
return f(id, ignoreFunc, files)
}
}