lib/generator.ex

defmodule CWMP.Protocol.Generator do
  import XmlBuilder

  @moduledoc """
  Generation of CWMP XML messages, from Elixir data structures.
  """

  @doc """
  Generates a CWMP envelope from an Elixir data structure.
  """
  def generate!(head, req, version \\ "1-4") do
    element('SOAP-ENV:Envelope',
      %{
        'xmlns:SOAP-ENV': "http://schemas.xmlsoap.org/soap/envelope/",
        'xmlns:SOAP-ENC': "http://schemas.xmlsoap.org/soap/encoding/",
        'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance",
        'xmlns:xsd': "http://www.w3.org/2001/XMLSchema",
        'xmlns:cwmp': "urn:dslforum-org:cwmp-#{version}"
      },
      [ element('SOAP-ENV:Header', [CWMP.Protocol.Generate.generate(head)]), element('SOAP-ENV:Body', [CWMP.Protocol.Generate.generate(req)]) ] ) |> generate;
  end

  @doc """
  Non-throwing version of generate!.
  """
  def generate(head, req, version \\ "1-4") do
    try do
      {:ok, generate!(head, req, version)}
    catch
      err -> {:error, err}
    end
  end
end