ProtoRune.XRPC.DSL (proto_rune v0.1.0)

The XRPC.DSL module provides macros to define queries and procedures for interacting with the XRPC system, simplifying the creation of API methods for querying or performing procedures. It supports building custom XRPC queries and procedures by encoding method names and dynamically generating functions based on user-defined parameters.

Overview

The primary purpose of this module is to offer a simple DSL for defining queries and procedures in Elixir projects using XRPC. It automates the generation of functions that initiate XRPC requests, reducing boilerplate code for developers.

Key Features:

  • Query Definition: Use the defquery/1 macro to define an XRPC query method.
  • Procedure Definition: Use the defprocedure/2 macro to define an XRPC procedure method.
  • Parameter Handling: The param/2 macro allows specifying parameters and their types for queries and procedures.
  • Automatic Method Name Encoding: Converts method names to function names by snakelizing the last segment of the method.

Macros

defquery/1

Defines a query function based on the given method name.

defquery("app.bsky.actor.getProfile")

This creates a function that returns a new query for the app.bsky.actor.getProfile method.

defquery/2

Defines a query with parameters.

defquery("app.bsky.feed.getFeed", do: block)

Within the block, you can specify parameters using the param/2 macro. The generated function will include these parameters in the query.

defprocedure/2

Defines a procedure with parameters.

defprocedure("app.bsky.actor.mute", do: block)

Similar to defquery/2, you can specify parameters in the block using the param/2 macro. This will generate a function that returns a new procedure with the given method and parameters.

param/2

Defines a parameter for queries or procedures.

param(:actor_id, :string)

This specifies a parameter with a key of actor_id and a type of :string, which will be included in the final query or procedure.

Usage Example

defmodule MyApp.Bsky do
  import XRPC.DSL

  defquery "app.bsky.actor.getProfile"

  defprocedure "app.bsky.actor.mute" do
    param :actor_id, :string
  end
end

In this example:

  • get_profile/0 is generated as a function that creates a query for app.bsky.actor.getProfile.
  • mute/0 is generated as a function that creates a procedure for app.bsky.actor.mute with the parameter :actor_id of type :string.

Summary

Types

@type options() :: [
  for: atom() | nil,
  authenticated: boolean() | nil,
  refresh: boolean() | nil
]

Functions

Link to this macro

defprocedure(method, opts)

(macro)
Link to this macro

defprocedure(method, opts, list)

(macro)
Link to this macro

defquery(method, opts)

(macro)
@spec defquery(String.t(), options()) :: Macro.t()
@spec defquery(String.t(), options()) :: Macro.t()
Link to this macro

defquery(method, opts, list)

(macro)
@spec defquery(String.t(), options(), [{:do, Macro.t()}]) :: Macro.t()
@spec defquery(String.t(), options(), [{:do, Macro.t()}]) :: Macro.t()
Link to this function

encode_method_name(method)

Link to this macro

param(key, type)

(macro)