| // Licensed to the Apache Software Foundation (ASF) under one or more |
| // contributor license agreements. See the NOTICE file distributed with |
| // this work for additional information regarding copyright ownership. |
| // The ASF licenses this file to You 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" |
| ) |
| |
| import ( |
| "github.com/apache/dubbo-kubernetes/pkg/bufman/bufpkg/bufanalysis" |
| "github.com/apache/dubbo-kubernetes/pkg/bufman/bufpkg/bufcheck/buflint/internal/buflintcheck" |
| "github.com/apache/dubbo-kubernetes/pkg/bufman/bufpkg/bufcheck/internal" |
| "github.com/apache/dubbo-kubernetes/pkg/bufman/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) |
| } |
| } |