Building the interface layer
Let’s define a new module, MixMusic.DSL
, to define the DSL module. The first thing we need to do is convert a list of options to a Note
struct. So, we will define a function to do that:
lib/mix_music/dsl.ex
defmodule MixMusic.DSL do @moduledoc """ DSL to compose music in Elixir """ def note_from_options(class, options) do params = options |> Keyword.put(:class, class) |> Enum.into(%{}) struct!(MixMusic.Note, params) end end
Next, let’s start working on the interface part of this module by defining the __using__/1
macro. As part of the __using__/1
macro, we will do the following:
Import the MixMusic.DSL
module because it will define macros and functions used in the DSL
Register...