graphql?
Или может можно передать контекст в виде резолвера с которого поступил вызов?
callback: fn data, parent, args -> … end
можно сделать макрос типа такого defmacro with_context(resolver) do quote do resolve fn args, context -> unquote(resolver).(Map.put(args, :context, context), context) end end end object :user do resolve with_context(dataloader(User)) end
спасибо, но блин к сожалению макросы для меня темный лес. Все не найду времени, чтобы в этом разобраться.
Макросы 101 1. Код представлен в виде AST. То есть AST для x + 1 это {:+, [], [{:x, [], Elixir}, 1]} 2. То что между quote do и end — возвращается как AST. То есть iex> quote(do: 1 + 2) вернёт {:+, [], [1, 2]} 3. То что внутри unquote — вставляется в AST по значению То есть iex> x = 1 iex> quote(do: unquote(x) + 2) {:+, [], [1, 2]} 4. defmacro my_macro(input_ast), где my_macro это фукнция, которая принимает AST (input_ast) и возвращает AST, которое будет вставлено в код. Конец
Когда-то давно, когда разбирался в макросах - пару статей с примерами наваял, пытался по-простому разложить, надеюсь поможет разобраться https://sofakingcode.medium.com/e1cb313979c8
Спасибо всем) теперь точно разберусь!
Хорошая статья Только вот в следующей статье плохой пример с use для роутеров. Роутер это плаг, поэтому можно просто в одном роуетере передавать запрос в другой роутер
макросы - это код, "пишушие" другой код. допустим ты хочешь наплодить функций вида def greet_vasya, do: "Hello, vasya!" def greet_lena, do: "Hello, lena!" ... Ты пишешь функцию def generate_greet(name) do "def greet_#{name}, do: \"Hello, #{name}!\"" end и можешь использовать её в генерации кода File.write("greets.ex", "defmodule Greets do") File.write("greets.ex", generate_greet("vasya"), :append) File.write("greets.ex", generate_greet("lena"), :append) File.write("greets.ex", "end", :append) Обрати внимание, что в "def greet_#{name}, do: \"Hello, #{name}!\"" есть цитируемые и подставляемые части. цитируемые - это def greet_, , do:\"Hello, , !\" подставляемые - это два раза #{name} Макрос делает по сути то же самое, только а) сразу в AST, б) цитируемые части вместо кавычек обрамляются quote do ... end, а подставляемые - unquote(...) defmacro generate_greet(name) do fun_name = "greet_#{name}" greet_string = "Hello, #{name}!" quote do def unquote(fun_name), do: unquote(greet_string) end end
Обсуждают сегодня