defmodule GitHub do
alias GitHub.Config
alias GitHub.Error
alias GitHub.Operation
@doc """
Constructs a `GitHub.App` struct using information from configuration
This is a convenience function for creating `GitHub.App` structs that are compatible with the
`GitHub.Auth` protocol for authenticating requests. It accepts the name of a GitHub App that is
configured using the `apps` key:
iex> app = GitHub.app(:my_app)
%GitHub.App{id: 12345, pem: "\"-----BEGIN RSA PRIVATE KEY..."}
iex> GitHub.Apps.get_installation(67890, auth: app)
{:ok, %GitHub.Installation{...}}
It is common (and strongly recommended) to use environment variables and runtime configuration
for the app ID and private key.
## Configuration
App configs are always given as 3-tuples containing a configuration name for the app (atom),
the app's ID (integer), and the app's private key (string, PEM formatted).
config :oapi_config,
apps: [
{:my_app, 12345, "\"-----BEGIN RSA PRIVATE KEY..."}
]
## Caching
JWTs are designed to last for several minutes.
"""
@spec app(atom) :: GitHub.App.t() | nil
def app(app_name) do
case Config.app(app_name) do
{:ok, {_app_name, app_id, private_key}} ->
struct(GitHub.App, %{id: app_id, pem: private_key})
_else ->
nil
end
end
@doc """
Run a client operation and return the raw Operation or Error
Normal client operation calls return only the response body. This function can be useful when
the caller needs additional information, such as data from the response headers.
The `args` passed to this function should not include the `opts` argument usually available on
client operations. Instead, any such options should be passed as the final argument to `raw/4`.
## Example
iex> GitHub.raw(GitHub.Users, :get_authenticated, [])
{:ok, %GitHub.Operation{}}
"""
@spec raw(module, atom, [any], keyword) :: {:ok, Operation.t()} | {:error, Error.t()}
def raw(module, function, args, opts \\ []) do
opts = Keyword.put(opts, :wrap, false)
case apply(module, function, args ++ [opts]) do
%Operation{} = operation -> {:ok, operation}
%Error{} = error -> {:ok, error}
end
end
end