Skip to content

Commit

Permalink
feat: add registry for custom rule and formatters
Browse files Browse the repository at this point in the history
  • Loading branch information
muthukrishnan24 committed Sep 22, 2021
1 parent 63f2581 commit d5963f6
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 20 deletions.
50 changes: 30 additions & 20 deletions config/lint.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,18 @@ import (
"github.com/conventionalcommit/commitlint/lint"
)

// RegisterRule registers a custom rule
// if rule already exists, returns error
func RegisterRule(rule lint.Rule) error {
return globalRegistry.RegisterRule(rule)
}

// RegisterFormatter registers a custom formatter
// if formatter already exists, returns error
func RegisterFormatter(format lint.Formatter) error {
return globalRegistry.RegisterFormatter(format)
}

// GetLinter returns Linter for given confFilePath
func GetLinter(conf *lint.Config) (*lint.Linter, error) {
rules, err := GetEnabledRules(conf)
Expand All @@ -16,37 +28,35 @@ func GetLinter(conf *lint.Config) (*lint.Linter, error) {
}

// GetFormatter returns the formatter as defined in conf
func GetFormatter(c *lint.Config) (lint.Formatter, error) {
for _, f := range defaultFormatters {
if f.Name() == c.Formatter {
return f, nil
}
func GetFormatter(conf *lint.Config) (lint.Formatter, error) {
format, ok := globalRegistry.GetFormatter(conf.Formatter)
if !ok {
return nil, fmt.Errorf("'%s' formatter not found", conf.Formatter)
}
return nil, fmt.Errorf("%s formatter not found", c.Formatter)
return format, nil
}

// GetEnabledRules forms Rule object for rules which are enabled in config
func GetEnabledRules(conf *lint.Config) ([]lint.Rule, error) {
// rules lookup map
rulesMap := map[string]lint.Rule{}
for _, r := range defaultRules {
rulesMap[r.Name()] = r
}

enabledRules := make([]lint.Rule, 0, len(conf.Rules))

for ruleName, ruleConfig := range conf.Rules {
r, ok := rulesMap[ruleName]
// Checking if rule is registered
// before checking if rule is enabled
r, ok := globalRegistry.GetRule(ruleName)
if !ok {
return nil, fmt.Errorf("unknown rule: %s", ruleName)
return nil, fmt.Errorf("'%s' rule not found", ruleName)
}
if ruleConfig.Enabled {
err := r.Apply(ruleConfig.Argument, ruleConfig.Flags)
if err != nil {
return nil, err
}
enabledRules = append(enabledRules, r)

if !ruleConfig.Enabled {
continue
}

err := r.Apply(ruleConfig.Argument, ruleConfig.Flags)
if err != nil {
return nil, err
}
enabledRules = append(enabledRules, r)
}

return enabledRules, nil
Expand Down
90 changes: 90 additions & 0 deletions config/registry.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
package config

import (
"fmt"
"sync"

"github.com/conventionalcommit/commitlint/lint"
)

var globalRegistry = newRegistry()

type registry struct {
mut *sync.Mutex

allRules map[string]lint.Rule
allFormatters map[string]lint.Formatter
}

func newRegistry() *registry {
reg := &registry{
mut: &sync.Mutex{},

allRules: make(map[string]lint.Rule),
allFormatters: make(map[string]lint.Formatter),
}

// Register Default Rules
for _, rule := range defaultRules {
err := reg.RegisterRule(rule)
if err != nil {
// default rules should not throw error
panic(err)
}
}

// Register Default Formatters
for _, format := range defaultFormatters {
err := reg.RegisterFormatter(format)
if err != nil {
// default formatters should not throw error
panic(err)
}
}

return reg
}

func (r *registry) RegisterRule(rule lint.Rule) error {
r.mut.Lock()
defer r.mut.Unlock()

_, ok := r.allRules[rule.Name()]
if ok {
return fmt.Errorf("'%s' rule already registered", rule.Name())
}

r.allRules[rule.Name()] = rule

return nil
}

func (r *registry) RegisterFormatter(format lint.Formatter) error {
r.mut.Lock()
defer r.mut.Unlock()

_, ok := r.allFormatters[format.Name()]
if ok {
return fmt.Errorf("'%s' formatter already registered", format.Name())
}

r.allFormatters[format.Name()] = format

return nil
}

func (r *registry) GetRule(name string) (lint.Rule, bool) {
r.mut.Lock()
defer r.mut.Unlock()

rule, ok := r.allRules[name]
return rule, ok
}

func (r *registry) GetFormatter(name string) (lint.Formatter, bool) {
r.mut.Lock()
defer r.mut.Unlock()

format, ok := r.allFormatters[name]
return format, ok
}

0 comments on commit d5963f6

Please sign in to comment.