# Meandro
## Find dead code in Elixir applications
![a spiraling oxbow lake, in the style of Salvador Dalí](https://repository-images.githubusercontent.com/517563597/31d745f4-5e0d-4680-97d2-d80e8d1c275e)
What kind of dead code? Meandro currently has rules to find:
- unused function arguments
- unused struct fields
- unused record fields
- unused configuration options
- unused callbacks
- unused macros
## Installation
The package can be installed [from hex](https://hex.pm/packages/meandro) by
adding `meandro` to your list of dependencies in `mix.exs`:
```elixir
def deps do
[
{:meandro, "~> 0.1.0"}
]
end
```
The docs can be found at [https://hexdocs.pm/meandro](https://hexdocs.pm/meandro).
## Usage
```
mix meandro
```
is the basic command. It'll run all configured rules (which is all of them by default) against all of the `*.ex` files in your application.
You can pass the `--files` argument if you'd like to check only particular files.
```
mix meandro --files lib/foo.ex,lib/bar.ex
```
Be warned, however, that it will _only_ look at those files. Functions declared in those files but used elsewhere will be seen as "unused."
## Configuration
The plugin supports the following configuration options in the `meandro` section of `mix.exs`:
- `rules` (`[Meandro.Rule.t()]`):
- This is the list of rules to apply to the analyzed code. Each rule is a module that should apply the `Meandro.Rule` behavior.
- If this option is not defined, meandro will apply all of [the default rules](lib/meandro/rules).
- `parsing` (`Meandro.Util.parsing_style()`):
- This parameter determines if meandro should parse files in a parallel (mapping through `Task.async/1`) or sequential (plain `Enum.map/2`) fashion.
- The default value is `parallel` since it's faster.
- `ignore` (`[Path.t() | {Path.t(), Meandro.Rule.t() | [Meandro.Rule.t()]} | {Path.t(), Meandro.Rule.t() | [Meandro.Rule.t()], list()}]`):
- List of wildcard patterns representing the files and rules that meandro will ignore when analyzing. Tuple format is used to ignore either a specific rule or a set of rules in those files.
### Example
```elixir
def project do
[
meandro: meandro_config(),
...
]
end
def meandro_config() do
%{
rules: [Meandro.Rule.UnnecessaryFunctionArguments],
parsing: :sequential,
ignore: ["test/example.ex"]
}
end
```