lib/led_strip_driver/driver.ex

defmodule Fledex.LedStripDriver.Driver do
  use Fledex.Color.Types
  require Logger

  @callback init(module_init_args :: map) :: map
  @callback transfer(leds :: list(colorint), counter :: pos_integer, config :: map) :: map
  @callback terminate(reason, config :: map) :: :ok
    when reason: :normal | :shutdown | {:shutdown, term()} | term()

    @spec init(map, Fledex.LedDriver.t) :: Fledex.LedDriver.t
    def init(init_args, state) do
      configs = for module <- state.led_strip.driver_modules do
        Logger.info("Creating driver: #{inspect module}")
        module_init_args = init_args[:led_strip][:config][module] || %{}
        config = module.init(module_init_args)
        {module, config}
      end

      put_in(state.led_strip.config, Enum.into(configs, %{}))
    end

    @spec transfer(list(colorint), Fledex.LedDriver.t) :: Fledex.LedDriver.t
    def transfer(leds, state) do
      configs = for module <- state.led_strip.driver_modules do
        config = module.transfer(leds, state[:timer][:counter], state[:led_strip][:config][module])
        {module, config}
      end

      put_in(state.led_strip.config, Enum.into(configs, %{}))
    end

    def terminate(reason, state) do
      for module <- state.led_strip.driver_modules do
        module.terminate(reason, state[:led_strip][:config][module])
      end
      :ok
    end
end