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 }