Current section

Files

Jump to
wax lib messages templates button_parameter.ex
Raw

lib/messages/templates/button_parameter.ex

defmodule Wax.Messages.Templates.ButtonParameter do
@moduledoc """
Template button parameter struct
"""
@typep parameter_type :: :payload | :text
@type t :: %__MODULE__{
type: parameter_type(),
payload: String.t() | map(),
text: String.t()
}
@derive {Jason.Encoder, only: [:type, :payload, :text]}
defstruct [
:type,
:payload,
:text
]
@doc """
Converts a keyword list of parameters 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, [parsed_param | acc]}
{:invalid_param, invalid_param} ->
{:halt, {:error, "Invalid button param: #{inspect(invalid_param)}"}}
end
end)
end
def parse({:payload, payload}) when is_binary(payload) or is_map(payload) do
%__MODULE__{type: :payload, payload: payload}
end
def parse({:text, text}) when is_binary(text) do
%__MODULE__{type: :text, text: text}
end
def parse(param) do
{:invalid_param, param}
end
@doc """
Validates parameter data
"""
@spec validate({atom(), term()}) :: :ok | {:error, String.t()}
def validate({:payload, payload}) when is_binary(payload) or is_map(payload) do
:ok
end
def validate({:text, text}) when is_binary(text) do
:ok
end
end