Packages
ex_gram
0.32.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 settings like middlewares, commands and regex
"""
defmacro __using__(_opts) do
quote do
import ExGram.Middleware.Builder,
only: [middleware: 1, middleware: 2, command: 1, command: 2, regex: 2, regex: 3]
Module.register_attribute(__MODULE__, :middlewares, accumulate: true)
Module.register_attribute(__MODULE__, :commands, accumulate: true)
Module.register_attribute(__MODULE__, :regexes, accumulate: true)
@before_compile ExGram.Middleware.Builder
end
end
defmacro middleware(middleware, opts \\ []) do
quote do
@middlewares {unquote(middleware), unquote(opts)}
end
end
defmacro command(command, opts \\ []) do
name = Keyword.get(opts, :name, String.to_atom(command))
description = Keyword.get(opts, :description)
quote do
@commands [
command: unquote(command),
name: unquote(name),
description: unquote(description)
]
end
end
defmacro regex(regex, name, _opts \\ []) do
quote do
@regexes [
regex: ExGram.Middleware.Builder.compile_regex(unquote(regex)),
name: unquote(name)
]
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 =
Module.get_attribute(env.module, :middlewares) |> Enum.reverse() |> Macro.escape()
commands = Module.get_attribute(env.module, :commands) |> Enum.reverse() |> Macro.escape()
regexes = Module.get_attribute(env.module, :regexes) |> Enum.reverse() |> Macro.escape()
quote do
def middlewares(), do: unquote(middlewares)
def commands(), do: unquote(commands)
def regexes(), do: unquote(regexes)
# Do it like plug and decompile all the core with the middlewares here?
end
end
end