diff --git a/DEVELOPING.md b/DEVELOPING.md index caf81a1f9..8346e8c3d 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -10,17 +10,9 @@ Clone the project: git clone git@github.com:mgechev/revive.git cd revive ``` - -In order to fetch all the dependencies run: - -```bash -make install -``` - ## Build In order to build the project run: - ```bash make build ``` @@ -31,14 +23,38 @@ The command will produce the `revive` binary in the root of the project. If you want to develop a new rule, follow as an example the already existing rules in the [rule package](https://github.com/mgechev/revive/tree/master/rule). -All rules should implement the following interface: - +Each rule needs to implement the `lint.Rule` interface: ```go type Rule interface { Name() string Apply(*File, Arguments) []Failure } ``` +All rules with a configuration must implement `lint.ConfigurableRule` interface: +```go +type ConfigurableRule interface { + Configure(Arguments) error +} +``` + +The `Arguments` type is an alias of the type `[]any`. The arguments of the rule are passed from the configuration file. + +#### Example + +Let's suppose we have developed a rule called `BanStructNameRule` which disallow us to name a structure with a given identifier. We can set the banned identifier by using the TOML configuration file: + +```toml +[rule.ban-struct-name] + arguments = ["Foo"] +``` + +With the snippet above we: + +- Enable the rule with the name `ban-struct-name`. The `Name()` method of our rule should return a string that matches `ban-struct-name`. +- Configure the rule with the argument `Foo`. The list of arguments will be passed to `Apply(*File, Arguments)` together with the target file we're linting currently. + +A sample rule implementation can be found [here](/rule/argument_limit.go). + ## Development of formatters diff --git a/README.md b/README.md index 85418dc3e..70e56d038 100644 --- a/README.md +++ b/README.md @@ -636,32 +636,7 @@ To add a custom formatter you'll have to push it to this repository or fork it. ### Writing a Custom Rule -Each rule needs to implement the `lint.Rule` interface: - -```go -type Rule interface { - Name() string - Apply(*File, Arguments) []Failure -} -``` - -The `Arguments` type is an alias of the type `[]interface{}`. The arguments of the rule are passed from the configuration file. - -#### Example - -Let's suppose we have developed a rule called `BanStructNameRule` which disallow us to name a structure with a given identifier. We can set the banned identifier by using the TOML configuration file: - -```toml -[rule.ban-struct-name] - arguments = ["Foo"] -``` - -With the snippet above we: - -- Enable the rule with the name `ban-struct-name`. The `Name()` method of our rule should return a string that matches `ban-struct-name`. -- Configure the rule with the argument `Foo`. The list of arguments will be passed to `Apply(*File, Arguments)` together with the target file we're linting currently. - -A sample rule implementation can be found [here](/rule/argument_limit.go). +See [DEVELOPING.md](./DEVELOPING.md) for instructions on how to write a custom rule. #### Using `revive` as a library