Packages
telegex
1.1.1
1.9.0-rc.0
1.8.0
1.7.0
1.6.0
1.5.0
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.3-dev
1.2.2
1.2.1
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.10
1.0.0-rc.9
1.0.0-rc.8
1.0.0-rc.7
1.0.0-rc.6
1.0.0-rc.5
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.1.0-rc.11
0.1.0-rc.10
0.1.0-rc.9
0.1.0-rc.8
0.1.0-rc.7
0.1.0-rc.6
0.1.0-rc.5
0.1.0-rc.4
0.1.0-rc.3
0.1.0-rc.2
0.1.0-rc.1
0.0.4
0.0.3
0.0.2
0.0.1
A Telegram bot framework, with its client-side based on data and code generation, boasts unparalleled adaptation speed and correctness for new versions.
Current section
Files
Jump to
Current section
Files
lib/telegex/chain/context.ex
defmodule Telegex.Chain.Context do
@moduledoc false
defmacro __using__(_) do
quote do
import unquote(__MODULE__)
require unquote(__MODULE__)
end
end
@bot_field_spec quote do: {:bot, Telegex.Type.User.t(), enforce: true}
@payload_field_spec quote do: {:payload, %{method: String.t()}}
@reason_field_spec quote do: {:reason, any}
defmacro defcontext(sepcs) do
fields_ast = Enum.map(sepcs, &gen_field_spec_ast/1)
fields_ast =
fields_ast ++
[
gen_field_spec_ast(@bot_field_spec),
gen_field_spec_ast(@payload_field_spec),
gen_field_spec_ast(@reason_field_spec)
]
ast =
quote do
use TypedStruct
typedstruct do
unquote(fields_ast)
end
end
# ast |> Macro.to_string() |> IO.puts()
ast
end
# 将二元组转换为三元组
# like: {:user_id, {:integer, [], nil}}
defp gen_field_spec_ast({field, type}) do
gen_field_spec_ast([field, type, []])
end
defp gen_field_spec_ast({:{}, _, spec_ast}) do
gen_field_spec_ast(spec_ast)
end
defp gen_field_spec_ast(spec_ast) do
{:field, [], spec_ast}
end
end