lib/generate/helpers.ex

defmodule CWMP.Protocol.GenerateHelpers do
  import XmlBuilder

  defmacro __using__(_opts) do
    quote do
      import CWMP.Protocol.GenerateHelpers
    end
  end


  @moduledoc """

  A helper module for generating various bits of
  XML or other stings for the Generator modules.

  """

  @doc """

  Generates the XML for a FaultStruct used in TransferComplete and AutonomousTransferComplete and
  which ever other requests that include a FaultStruct. The 'fault' parameter is a types/fault_struct.ex
  type.

  """
  def faultStruct( fault ) do
    element( :FaultStruct, [ element( :FaultCode, fault.code ), element( :FaultString, fault.string ) ] )
  end

  @doc """

  Generates a string that represents the timestructure. If the timestructure given is
  somehow invalid, the default is used to generate a timestring. For Inform that would
  be today. For TransferComplete and others that have epoch as the default value, that is
  used.

  """
  @spec timeString( DateTime.t, DateTime.t ) :: String.t
  def timeString( timestruct, default \\ DateTime.from_unix!(0) ) do
    try do
      case timestruct do
        nil ->
          DateTime.to_iso8601(default)
        _ ->
          DateTime.to_iso8601(timestruct)
      end
    rescue
      _ ->
        DateTime.to_iso8601(default)
    end
  end

  @doc """

  Translates a boolean value to "0" or "1"

  """
  def boolValue(b) when is_boolean(b) do
    case b do
      false -> "0"
      _ -> 1
    end
  end

  def boolValue(i) when is_integer(i) do
    case i do
      0 -> "0"
      _ -> 1
    end
  end

  def boolValue(_s) do
    raise "Not a boolean value"
  end

  @doc """

  Ensures that the passed value is an integer and that it satisfies
  the restraints layed out by the anon function passed.

  """
  def integerValue(i, fun \\ fn(x) -> x end)

  def integerValue(i, fun) when is_integer( i ) do
    if fun.(i) do
      i
    else
      raise "Integer does not validate"
    end
  end

  def integerValue(i, fun) do
    case Integer.parse(i) do
      {v,""} -> if fun.(v) do
                  v
                else
                  raise "Integer does not validate"
                end
      _ -> raise "Integer value does not parse"
    end
  end

end