View Source GitHub.Plugin (GitHub REST API Client v0.2.1)
Plugins provide functionality for the API client
Note
This module is unlikely to be used directly by applications. The documentation contained here is useful for developers who would like to implement new functionality for the client.
This library has no opinions on how to complete API requests. Instead of requiring a particular HTTP client or JSON serializer, requests are completed using a series of plugins called a stack. To modify the behavior of the client, applications can add or modify plugins.
Plugins are functions that accept a GitHub.Operation struct — and any options — and return
either an :ok or an :error tuple:
alias GitHub.{Error, Operation}
@spec my_plugin(Operation.t(), keyword) :: {:ok, Operation.t()} | {:error, Error.t()}
def my_plugin(operation, opts) do
# ...
endAn :error tuple will immediately stop the stack and return the error. An :ok tuple will
continue running the stack with the modified operation struct. If the stack concludes with a
successful operation, the response_body is returned.
options
Options
Plugins may accept options that modify their behavior. It is recommended that they consider options from three sources:
- Options passed to the operation function (available in the
__opts__key of the operation struct's private field). This is likely to include options not relevant to the plugin. - Options passed to the plugin definition (available as the second argument of the plugin function).
- Options defined globally using the application environment.
This hierarchy can be accomplished by calling Keyword.merge/2 on the plugin options argument and
the operation's options (order matters!), then calling GitHub.Config.plugin_config/4 to
incorporate the application environment as a fallback. (For required options, the sibling
function GitHub.Config.plugin_config!/3 is also available.)
In this way, plugins can be configured at all levels of the code:
# Highest precedence: options from the caller
GitHub.Repos.get("aj-foster", "open-api-github", some: :option)
# Medium precedence: options in the plugin definition
{MyPlugin, :my_function, some: :option}
# Lowest precedence: global configuration
config :oapi_github, MyPlugin, some: :optionPlugins should take care to document their available options and avoid naming collisions.