README.md

# Qsm

A state machine built that leverages SQS to act in a distributed manner.

### Note About Authentication

If you're planning on using config file authentication, the following needs to be added to your
`config.exs`:

```elixir
config :ex_aws,
  access_key_id: [{:system, "AWS_ACCESS_KEY_ID"}, {:awscli, "default", 30}, :instance_role],
  secret_access_key: [{:system, "AWS_SECRET_ACCESS_KEY"}, {:awscli, "default", 30}, :instance_role]
```

## Installation

Add `qsm` to your list of dependencies in `mix.exs`:

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

and run `$ mix deps.get`.

## Usage
```elixir
iex(1)> defmodule Qsm.MockEntryState do
...(1)>   @behaviour Qsm.State
...(1)>
...(1)>   def get_next_state(m) do
...(1)>     IO.inspect m
...(1)>     Process.sleep 1000
...(1)>     {Qsm.MockExitState, m}
...(1)>   end
...(1)> end
iex(2)> defmodule Qsm.MockExitState do
...(2)>   @behaviour Qsm.State
...(2)>
...(2)>   def get_next_state(_m) do
...(2)>     nil
...(2)>   end
...(2)> end
iex(3)> Qsm.enqueue_work("my_worker_queue", Qsm.MockEntryState, "foo")
:ok
iex(4)> {:ok, pid} = Qsm.start_link("my_worker_queue")
iex(5)> Qsm.run_async(pid)
:ok
"foo"
```

Every state should implement the `Qsm.State` behaviour. All you need to define a `get_next_state` function that takes a serializable message and returns either a `Qsm.State` or `nil`.