Current section
Files
Jump to
Current section
Files
lib/builders/builder.ex
defmodule TelegramEx.Builder do
@moduledoc """
Shared helpers for TelegramEx builder modules.
"""
alias TelegramEx.Effect
alias TelegramEx.MimeType
@type input :: map() | Effect.t()
@doc """
Adds a value to the effect payload.
"""
@spec put_payload(input(), atom(), term()) :: Effect.t()
def put_payload(input, key, value) do
input
|> Effect.wrap()
|> Effect.map_ctx(fn ctx ->
Map.get(ctx, :payload, %{})
|> Map.put(key, value)
|> then(&Map.put(ctx, :payload, &1))
end)
end
@doc """
Reads a local file and adds it as a multipart payload value.
If the file cannot be read, the returned effect contains `{:file, reason}`.
"""
@spec put_file_payload(input(), atom(), String.t()) :: Effect.t()
def put_file_payload(input, key, path) do
input
|> Effect.wrap()
|> Effect.then(fn ctx ->
case File.read(path) do
{:ok, content} ->
{:ok, put_raw_file_payload(ctx, key, path, content)}
{:error, reason} ->
{:error, {:file, reason}}
end
end)
end
defp put_raw_file_payload(ctx, key, path, content) do
filename = Path.basename(path)
file = {content, filename: filename, content_type: MimeType.from_path(path)}
ctx
|> Map.get(:payload, %{})
|> Map.put(key, file)
|> then(&Map.put(ctx, :payload, &1))
end
end