summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/mgechev/revive/rule/max-public-structs.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/mgechev/revive/rule/max-public-structs.go')
-rw-r--r--vendor/github.com/mgechev/revive/rule/max-public-structs.go67
1 files changed, 67 insertions, 0 deletions
diff --git a/vendor/github.com/mgechev/revive/rule/max-public-structs.go b/vendor/github.com/mgechev/revive/rule/max-public-structs.go
new file mode 100644
index 0000000000..9a2d07cbc1
--- /dev/null
+++ b/vendor/github.com/mgechev/revive/rule/max-public-structs.go
@@ -0,0 +1,67 @@
+package rule
+
+import (
+ "go/ast"
+
+ "strings"
+
+ "github.com/mgechev/revive/lint"
+)
+
+// MaxPublicStructsRule lints given else constructs.
+type MaxPublicStructsRule struct{}
+
+// Apply applies the rule to given file.
+func (r *MaxPublicStructsRule) Apply(file *lint.File, arguments lint.Arguments) []lint.Failure {
+ var failures []lint.Failure
+
+ fileAst := file.AST
+ walker := &lintMaxPublicStructs{
+ fileAst: fileAst,
+ onFailure: func(failure lint.Failure) {
+ failures = append(failures, failure)
+ },
+ }
+
+ ast.Walk(walker, fileAst)
+
+ max, ok := arguments[0].(int64) // Alt. non panicking version
+ if !ok {
+ panic(`invalid value passed as argument number to the "max-public-structs" rule`)
+ }
+
+ if walker.current > max {
+ walker.onFailure(lint.Failure{
+ Failure: "you have exceeded the maximum number of public struct declarations",
+ Confidence: 1,
+ Node: fileAst,
+ Category: "style",
+ })
+ }
+
+ return failures
+}
+
+// Name returns the rule name.
+func (r *MaxPublicStructsRule) Name() string {
+ return "max-public-structs"
+}
+
+type lintMaxPublicStructs struct {
+ current int64
+ fileAst *ast.File
+ onFailure func(lint.Failure)
+}
+
+func (w *lintMaxPublicStructs) Visit(n ast.Node) ast.Visitor {
+ switch v := n.(type) {
+ case *ast.TypeSpec:
+ name := v.Name.Name
+ first := string(name[0])
+ if strings.ToUpper(first) == first {
+ w.current++
+ }
+ break
+ }
+ return w
+}