github.com/googleapis/api-linter@v1.65.2/rules/rules.go (about)

     1  // Copyright 2019 Google LLC
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  // 		https://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  // Package rules contains implementations of rules that apply to Google APIs.
    16  //
    17  // Rules are sorted into subpackages by the AIP (https://aip.dev/) that
    18  // mandates the rule. Every rule represented in code here must be represented
    19  // in English in a corresponding AIP. Conversely, anything mandated in an AIP
    20  // should have a rule here if it is feasible to enforce in code (sometimes it
    21  // is infeasible, however).
    22  //
    23  // A rule is technically anything with a `GetName()`, `GetURI()“, and
    24  // `Lint(*desc.FileDescriptorProto) []lint.Problem` method, but most rule
    25  // authors will want to use the rule structs provided in the lint package
    26  // (`&lint.MessageRule`, `&lint.FieldRule`, and so on). These run against
    27  // each applicable descriptor in the file (`MessageRule` against every message,
    28  // for example). They also have an `OnlyIf` property that can be used to run
    29  // against a subset of descriptors.
    30  //
    31  // A simple rule therefore looks like this:
    32  //
    33  //	var myRule = &lint.MessageRule{
    34  //	  Name: lint.NewRuleName(1234, "my-rule"),
    35  //	  LintMessage: func(m *desc.MessageDescriptor) []lint.Problem {
    36  //	    if isBad(m) {
    37  //	      return []lint.Problem{{
    38  //	        Message: "This message is bad.",
    39  //	        Descriptor: m,
    40  //	      }}
    41  //	    }
    42  //	    return nil
    43  //	  },
    44  //	}
    45  //
    46  // Once a rule is written, it needs to be registered. This involves adding
    47  // the rule to the `AddRules` method for the appropriate AIP package.
    48  // If this is the first rule for a new AIP, then the `rules.go` init() function
    49  // must also be updated to run the `AddRules` function for the new package.
    50  package rules
    51  
    52  import (
    53  	"github.com/googleapis/api-linter/lint"
    54  	"github.com/googleapis/api-linter/rules/aip0121"
    55  	"github.com/googleapis/api-linter/rules/aip0122"
    56  	"github.com/googleapis/api-linter/rules/aip0123"
    57  	"github.com/googleapis/api-linter/rules/aip0124"
    58  	"github.com/googleapis/api-linter/rules/aip0126"
    59  	"github.com/googleapis/api-linter/rules/aip0127"
    60  	"github.com/googleapis/api-linter/rules/aip0128"
    61  	"github.com/googleapis/api-linter/rules/aip0131"
    62  	"github.com/googleapis/api-linter/rules/aip0132"
    63  	"github.com/googleapis/api-linter/rules/aip0133"
    64  	"github.com/googleapis/api-linter/rules/aip0134"
    65  	"github.com/googleapis/api-linter/rules/aip0135"
    66  	"github.com/googleapis/api-linter/rules/aip0136"
    67  	"github.com/googleapis/api-linter/rules/aip0140"
    68  	"github.com/googleapis/api-linter/rules/aip0141"
    69  	"github.com/googleapis/api-linter/rules/aip0142"
    70  	"github.com/googleapis/api-linter/rules/aip0143"
    71  	"github.com/googleapis/api-linter/rules/aip0144"
    72  	"github.com/googleapis/api-linter/rules/aip0146"
    73  	"github.com/googleapis/api-linter/rules/aip0148"
    74  	"github.com/googleapis/api-linter/rules/aip0151"
    75  	"github.com/googleapis/api-linter/rules/aip0152"
    76  	"github.com/googleapis/api-linter/rules/aip0154"
    77  	"github.com/googleapis/api-linter/rules/aip0155"
    78  	"github.com/googleapis/api-linter/rules/aip0156"
    79  	"github.com/googleapis/api-linter/rules/aip0157"
    80  	"github.com/googleapis/api-linter/rules/aip0158"
    81  	"github.com/googleapis/api-linter/rules/aip0159"
    82  	"github.com/googleapis/api-linter/rules/aip0162"
    83  	"github.com/googleapis/api-linter/rules/aip0163"
    84  	"github.com/googleapis/api-linter/rules/aip0164"
    85  	"github.com/googleapis/api-linter/rules/aip0165"
    86  	"github.com/googleapis/api-linter/rules/aip0191"
    87  	"github.com/googleapis/api-linter/rules/aip0192"
    88  	"github.com/googleapis/api-linter/rules/aip0202"
    89  	"github.com/googleapis/api-linter/rules/aip0203"
    90  	"github.com/googleapis/api-linter/rules/aip0214"
    91  	"github.com/googleapis/api-linter/rules/aip0215"
    92  	"github.com/googleapis/api-linter/rules/aip0216"
    93  	"github.com/googleapis/api-linter/rules/aip0217"
    94  	"github.com/googleapis/api-linter/rules/aip0231"
    95  	"github.com/googleapis/api-linter/rules/aip0233"
    96  	"github.com/googleapis/api-linter/rules/aip0234"
    97  	"github.com/googleapis/api-linter/rules/aip0235"
    98  	"github.com/googleapis/api-linter/rules/aip4232"
    99  )
   100  
   101  type addRulesFuncType func(lint.RuleRegistry) error
   102  
   103  var aipAddRulesFuncs = []addRulesFuncType{
   104  	aip0121.AddRules,
   105  	aip0122.AddRules,
   106  	aip0123.AddRules,
   107  	aip0124.AddRules,
   108  	aip0126.AddRules,
   109  	aip0127.AddRules,
   110  	aip0128.AddRules,
   111  	aip0131.AddRules,
   112  	aip0132.AddRules,
   113  	aip0133.AddRules,
   114  	aip0134.AddRules,
   115  	aip0135.AddRules,
   116  	aip0136.AddRules,
   117  	aip0140.AddRules,
   118  	aip0141.AddRules,
   119  	aip0142.AddRules,
   120  	aip0143.AddRules,
   121  	aip0144.AddRules,
   122  	aip0146.AddRules,
   123  	aip0148.AddRules,
   124  	aip0151.AddRules,
   125  	aip0152.AddRules,
   126  	aip0154.AddRules,
   127  	aip0155.AddRules,
   128  	aip0156.AddRules,
   129  	aip0157.AddRules,
   130  	aip0158.AddRules,
   131  	aip0159.AddRules,
   132  	aip0162.AddRules,
   133  	aip0163.AddRules,
   134  	aip0164.AddRules,
   135  	aip0165.AddRules,
   136  	aip0191.AddRules,
   137  	aip0192.AddRules,
   138  	aip0202.AddRules,
   139  	aip0203.AddRules,
   140  	aip0214.AddRules,
   141  	aip0215.AddRules,
   142  	aip0216.AddRules,
   143  	aip0217.AddRules,
   144  	aip0231.AddRules,
   145  	aip0233.AddRules,
   146  	aip0234.AddRules,
   147  	aip0235.AddRules,
   148  	aip4232.AddRules,
   149  }
   150  
   151  // Add all rules to the given registry.
   152  func Add(r lint.RuleRegistry) error {
   153  	return addAIPRules(r, aipAddRulesFuncs)
   154  }
   155  
   156  func addAIPRules(r lint.RuleRegistry, addRulesFuncs []addRulesFuncType) error {
   157  	for _, addRules := range addRulesFuncs {
   158  		if err := addRules(r); err != nil {
   159  			return err
   160  		}
   161  	}
   162  	return nil
   163  }