Packages
ex_gram
0.55.1
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/macros.ex
defmodule ExGram.Macros do
@moduledoc """
`model/2` and `method/4` macros to build the API
"""
import __MODULE__.Helpers
defmacro model(name, params, description) do
tps = struct_type_specs(params)
initials =
Enum.map(tps, fn {id, _t} -> {id, nil} end)
dca = params_to_decode_as(params)
quote do
defmodule unquote(name) do
@moduledoc """
#{unquote(description)}
Check the documentation of this model in https://core.telegram.org/bots/api##{unquote(name) |> inspect() |> String.split(".") |> Enum.at(-1) |> String.downcase()}
"""
defstruct unquote(initials)
@type t :: %unquote(name){unquote_splicing(tps)}
def decode_as do
%unquote(name){unquote_splicing(dca)}
end
end
end
end
defmacro method(verb, name, params, returned, description) do
fname =
name
|> Macro.underscore()
|> String.to_atom()
# fnametest =
# "#{Macro.underscore(name)}_test"
# |> String.to_atom
fname_exception =
String.to_atom("#{Macro.underscore(name)}!")
analyzed = Enum.map(params, &analyze_param/1)
types_mand_value = mandatory_value_type(analyzed)
types_mand_spec = mandatory_type_specs(analyzed)
types_opt_spec = optional_type_specs(analyzed)
{mandatory_parameters, mandatory_body} = mandatory_parameters(analyzed)
{opt_par, opt_par_types} = optional_parameters(analyzed)
returned_type_spec = type_to_spec(returned)
file_parameters = file_parameters(analyzed)
quote location: :keep do
# Safe method
@doc """
#{unquote(description)}
Check the documentation of this method in https://core.telegram.org/bots/api##{String.downcase(unquote(name))}
"""
@spec unquote(fname)(unquote_splicing(types_mand_spec), options :: unquote(types_opt_spec)) ::
{:ok, unquote(returned_type_spec)}
| {:error, ExGram.Error.t()}
def unquote(fname)(unquote_splicing(mandatory_parameters), options \\ []) do
name = unquote(name)
verb = unquote(verb)
mandatory_body = unquote(mandatory_body)
file_parameters = unquote(file_parameters)
returned = unquote(returned)
method_ops = Keyword.take(options, unquote(opt_par))
mandatory_types = unquote(types_mand_value)
optional_types = unquote(opt_par_types)
ExGram.Macros.Executer.execute_method(
name,
verb,
mandatory_body,
file_parameters,
returned,
options,
method_ops,
mandatory_types,
optional_types
)
end
# Unsafe method
@doc """
Unsafe version of #{unquote(fname)}. It will return the response or raise in case of error.
#{unquote(description)}
Check the documentation of this method in https://core.telegram.org/bots/api##{String.downcase(unquote(name))}
"""
@spec unquote(fname_exception)(
unquote_splicing(types_mand_spec),
ops :: unquote(types_opt_spec)
) :: unquote(returned_type_spec)
def unquote(fname_exception)(unquote_splicing(mandatory_parameters), ops \\ []) do
case unquote(fname)(unquote_splicing(mandatory_parameters), ops) do
{:ok, result} -> result
{:error, error} -> raise error
end
end
end
end
end