Packages
ex_gram
0.65.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/middleware/builder.ex
defmodule ExGram.Middleware.Builder do
@moduledoc """
Macros for building bot middleware chains, commands, regex patterns, and init hooks.
This module provides a DSL for declaratively configuring bot behavior using module
attributes. Use `use ExGram.Middleware.Builder` in your bot module to access the
`middleware/1-2`, `command/1-2`, `regex/2-3`, and `on_bot_init/1-2` macros.
At compile time, these declarations are collected and exposed via `middlewares/0`,
`commands/0`, `regexes/0`, and `bot_inits/0` functions.
See the [Middlewares guide](middlewares.md) for usage examples.
"""
defmacro __using__(_opts) do
quote do
import ExGram.Middleware.Builder,
only: [
middleware: 1,
middleware: 2,
command: 1,
command: 2,
regex: 2,
regex: 3,
on_bot_init: 1,
on_bot_init: 2
]
@before_compile ExGram.Middleware.Builder
Module.register_attribute(__MODULE__, :middlewares, accumulate: true)
Module.register_attribute(__MODULE__, :commands, accumulate: true)
Module.register_attribute(__MODULE__, :regexes, accumulate: true)
Module.register_attribute(__MODULE__, :bot_inits, accumulate: true)
end
end
defmacro middleware(middleware, opts \\ []) do
quote do
@middlewares {unquote(middleware), unquote(opts)}
end
end
defmacro command(command, opts \\ []) do
{command_str, default_name} =
if is_atom(command) do
{Atom.to_string(command), command}
else
{command, String.to_atom(command)}
end
name = Keyword.get(opts, :name, default_name)
opts = Keyword.delete(opts, :name)
quote do
@commands [
command: unquote(command_str),
name: unquote(name),
opts: unquote(opts)
]
end
end
defmacro regex(regex, name, _opts \\ []) do
quote do
@regexes [
regex: ExGram.Middleware.Builder.compile_regex(unquote(regex)),
name: unquote(name)
]
end
end
defmacro on_bot_init(module, opts \\ []) do
quote do
@bot_inits {unquote(module), unquote(opts)}
end
end
def compile_regex(%{__struct__: Regex} = regex), do: regex
def compile_regex(binary) when is_binary(binary), do: Regex.compile!(binary)
@doc false
defmacro __before_compile__(env) do
middlewares =
env.module |> Module.get_attribute(:middlewares) |> Enum.reverse() |> Macro.escape()
commands = env.module |> Module.get_attribute(:commands) |> Enum.reverse()
ExGram.Bot.ValidateCommands.validate!(commands)
commands = Macro.escape(commands)
regexes = env.module |> Module.get_attribute(:regexes) |> Enum.reverse() |> Macro.escape()
bot_inits =
env.module |> Module.get_attribute(:bot_inits) |> Enum.reverse() |> Macro.escape()
quote do
def middlewares, do: unquote(middlewares)
def commands, do: unquote(commands)
def regexes, do: unquote(regexes)
def bot_inits, do: unquote(bot_inits)
end
end
end