defmodule Rujira.Node do @moduledoc """ Behaviour and configurable delegator for chain node queries. Consumers configure the implementation via application env: config :rujira_ex, node: MyApp.NodeImpl The implementation must export `query/3`. """ @type query_fun :: (GRPC.Channel.t(), term() -> {:ok, term()} | {:error, GRPC.RPCError.t() | term()}) @type query_fun3 :: (GRPC.Channel.t(), term(), keyword() -> {:ok, term()} | {:error, GRPC.RPCError.t() | term()}) @callback query(query_fun() | query_fun3(), term(), keyword()) :: {:ok, term()} | {:error, term()} @spec query(query_fun() | query_fun3(), term(), keyword()) :: {:ok, term()} | {:error, term()} def query(fun, request, opts \\ []) do impl().query(fun, request, opts) end defp impl do Application.get_env(:rujira_ex, :node) || raise "No :node implementation configured for :rujira_ex. " <> "Set `config :rujira_ex, node: YourNodeModule`" end end