Packages
ex_gram
0.63.0
0.67.0
0.66.0
0.65.0
0.64.0
0.63.0
0.62.0
0.61.0
0.60.0
0.58.0
0.57.0
0.56.1
0.56.0
0.55.1
0.55.0
0.54.0
0.53.0
0.52.2
0.52.1
0.52.0
0.51.1
0.51.0
0.50.2
0.50.1
0.50.0
0.41.0
0.40.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.1
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.2
0.6.1
0.6.0
0.5.0
0.5.0-rc6
0.5.0-rc5
0.5.0-rc4
0.5.0-rc3
0.5.0-rc2
Telegram Bot API low level and framework
Current section
Files
Jump to
Current section
Files
lib/ex_gram/adapter.ex
defmodule ExGram.Adapter do
@moduledoc """
Behaviour for HTTP adapters.
ExGram ships with three adapters:
- `ExGram.Adapter.Req` - Recommended, uses Req
- `ExGram.Adapter.Tesla` - Uses Tesla with configurable middleware
- `ExGram.Adapter.Test` - For testing, see [Testing guide](testing.md)
Implement this behaviour to create a custom adapter.
"""
@type verb :: :post | :get
@type path :: String.t()
@type body :: map() | list()
@type result_request :: {:ok, map} | {:error, ExGram.Error.t()}
@callback request(verb, path, body, keyword) :: result_request
def encode(%{__struct__: _} = x) do
x
|> Map.from_struct()
|> ExGram.Adapter.filter_map()
|> ExGram.Encoder.encode!()
end
def encode(x) when is_map(x) or is_list(x), do: ExGram.Encoder.encode!(x)
def encode(x), do: x
def filter_map(%{__struct__: _} = m) do
m |> Map.from_struct() |> filter_map()
end
def filter_map(m) when is_map(m) do
m
|> Enum.filter(fn {_key, value} -> not is_nil(value) end)
|> Map.new(fn {key, value} ->
cond do
is_list(value) -> {key, Enum.map(value, &filter_map/1)}
is_map(value) -> {key, filter_map(value)}
true -> {key, value}
end
end)
end
def filter_map(m) when is_list(m), do: Enum.map(m, &filter_map/1)
def filter_map(m), do: m
end