defmodule Strom.DSL do defmodule Pipeline do defstruct pipeline: nil end defmodule Transform do defstruct function: nil, module: nil end defmodule Source do defstruct origin: nil end defmodule Sink do defstruct origin: nil end defmodule Mixer do defstruct sources: [] end defmodule Splitter do defstruct branches: [] end defmodule Run do defstruct run: nil end defmacro source(origin) do quote do unless is_struct(unquote(origin)) do raise "Source origin must be a struct, given: #{inspect(unquote(origin))}" end %Strom.DSL.Source{origin: unquote(origin)} end end defmacro sink(origin) do quote do unless is_struct(unquote(origin)) do raise "Sink origin must be a struct, given: #{inspect(unquote(origin))}" end %Strom.DSL.Sink{origin: unquote(origin)} end end defmacro mixer(sources) do quote do unless is_list(unquote(sources)) do raise "Mixer sources must be a list, given: #{inspect(unquote(sources))}" end %Strom.DSL.Mixer{sources: unquote(sources)} end end defmacro splitter(branches) do quote do unless is_map(unquote(branches)) do raise "Branches in splitter must be a map, given: #{inspect(unquote(branches))}" end %Strom.DSL.Splitter{branches: unquote(branches)} end end defmacro pipeline(module) do quote do unless is_atom(unquote(module)) do raise "Pipeline be a module, given: #{inspect(unquote(module))}" end %Strom.DSL.Pipeline{pipeline: unquote(module)} end end defmacro transform(function_or_module) do # TODO quote do %Strom.DSL.Transform{function: unquote(function_or_module)} end end defmacro run() do quote do %Strom.DSL.Run{} end end defmacro __using__(_opts) do quote do import Strom.DSL @before_compile Strom.DSL @spec start() :: Strom.Flow.t() def start do Strom.Flow.start(__MODULE__) end @spec run() :: :ok def run() do Strom.Flow.run(__MODULE__) end @spec stop() :: :ok def stop do Strom.Flow.stop(__MODULE__) end end end defmacro __before_compile__(_env) do quote do def topology, do: @topology end end end