README.md

# MQTTMatcher

MQTTMatcher allows for defining functions to match MQTT topics.

It turns

```elixir
use MQTTMatcher
match "a/+b/#", payload, _args do
  IO.inspect(b)
  IO.inspect(rest)
end
```

into this:

```elixir
def match(path, payload, args \\ nil) do
  path
  |> String.split("/")
  |> int_mqtt_match(args)
end

defp int_mqtt_match(["a", b | rest], payload, args) do
  IO.inspect(b)
  IO.inspect(rest)
end
```

The variables defined in the MQTT topic with a beginning + are turned into Elixir variables,
the '#' is turned into a tail matching list. All matches are defined as private functions and a wrapper function
is created to call those functions, splitting the input MQTT topic and passing payloads as well as generic (optional) arguments.

## Matching rules
MQTTMatcher uses the following rules to expand the parts of the part to Elixir code:

| Path pattern | Elixir |
| --- | --- |
| foo| `"foo"`|
| +foo | `foo`|
| +_foo| `_foo`|
| +_ | `_` |
| + | `_` |

  Please note that repeating a named path pattern (`foo/+bar/+bar`) means that the pattern must repeat the same way to match. This means `foo/test/test` would match the given pattern, `foo/bar/baz` would not.


## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `mqtt_matcher` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:mqtt_matcher, "~> 0.1.0"}
  ]
end
```

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/mqtt_matcher](https://hexdocs.pm/mqtt_matcher).