Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/timbuchwaldt/mqtt_matcher

Elixir macro for matching mqtt topics
https://github.com/timbuchwaldt/mqtt_matcher

Last synced: about 2 months ago
JSON representation

Elixir macro for matching mqtt topics

Awesome Lists containing this project

README

        

# 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).