Current section
Files
Jump to
Current section
Files
lib/messages/interactive/header.ex
defmodule Wax.Messages.Interactive.Header do
alias Wax.Messages.Media
@type type :: :text | :document | :image | :video
@type t :: %__MODULE__{
document: Media.t(),
image: Media.t(),
text: String.t(),
sub_text: String.t(),
type: atom(),
video: Media.t()
}
defstruct [
:document,
:image,
:text,
:sub_text,
:type,
:video
]
defimpl Jason.Encoder do
def encode(value, opts) do
fields = [:sub_text, :type]
fields =
case Map.get(value, :type) do
:document -> [:document | fields]
:image -> [:image | fields]
:video -> [:video | fields]
:text -> [:text | fields]
end
value
|> Map.take(fields)
|> Jason.Encode.map(opts)
end
end
@doc """
Creates a new header
Depending the type, it will require a binary content or a Media content
Requires binary:
- text
Requires media:
- document
- image
- video
"""
@spec new_header(type(), String.t() | Media.t(), String.t()) :: __MODULE__.t()
def new_header(:text, text, sub_text) when is_binary(text) do
%__MODULE__{type: :text, text: text, sub_text: sub_text}
end
def new_header(:document, %Media{} = media, sub_text) do
%__MODULE__{type: :document, document: media, sub_text: sub_text}
end
def new_header(:image, %Media{} = media, sub_text) do
%__MODULE__{type: :image, image: media, sub_text: sub_text}
end
def new_header(:video, %Media{} = media, sub_text) do
%__MODULE__{type: :video, video: media, sub_text: sub_text}
end
end