Current section
Files
Jump to
Current section
Files
lib/messages/templates/parameter.ex
defmodule Wax.Messages.Templates.Parameter do
@moduledoc """
Template parameter struct
TODO: Support for currency and date time parameters
"""
alias Wax.Messages.Media
@typep parameter_type :: :document | :image | :text | :video
@type t :: %__MODULE__{
type: parameter_type(),
text: String.t(),
image: Media.t(),
document: Media.t(),
video: Media.t()
}
@derive {Jason.Encoder, only: [:type, :text, :image, :document, :video]}
defstruct [
:type,
:text,
:image,
:document,
:video
]
@doc """
Converts a keyword list of params to a list of structs
"""
@spec parse(Keyword.t()) :: [__MODULE__.t()]
def parse([_ | _] = params) do
Enum.reduce_while(params, [], fn param, acc ->
case parse(param) do
%__MODULE__{} = parsed_param ->
{:cont, acc ++ [parsed_param]}
{:invalid_param, invalid_param} ->
{:halt, {:error, "Invalid param: #{inspect(invalid_param)}"}}
end
end)
end
def parse({:text, text}) when is_binary(text) do
%__MODULE__{type: :text, text: text}
end
def parse({:image, %Media{} = image}) do
%__MODULE__{type: :image, image: image}
end
def parse({:document, %Media{} = document}) do
%__MODULE__{type: :document, document: document}
end
def parse({:video, %Media{} = video}) do
%__MODULE__{type: :video, video: video}
end
def parse(param) do
{:invalid_param, param}
end
end