lib/operations/meta.ex

defmodule GitHub.Meta do
  @moduledoc """
  Provides API endpoints related to meta
  """

  @default_client GitHub.Client

  @doc """
  Get GitHub meta information

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/meta#get-github-meta-information)

  """
  @spec get(keyword) :: {:ok, GitHub.ApiOverview.t()} | {:error, GitHub.Error.t()}
  def get(opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      call: {GitHub.Meta, :get},
      url: "/meta",
      method: :get,
      response: [{200, {GitHub.ApiOverview, :t}}, {304, nil}],
      opts: opts
    })
  end

  @doc """
  Get all API versions

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/meta#get-all-api-versions)

  """
  @spec get_all_versions(keyword) :: {:ok, [String.t()]} | {:error, GitHub.Error.t()}
  def get_all_versions(opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      call: {GitHub.Meta, :get_all_versions},
      url: "/versions",
      method: :get,
      response: [{200, {:array, :string}}, {404, {GitHub.BasicError, :t}}],
      opts: opts
    })
  end

  @doc """
  Get Octocat

  ## Options

    * `s` (String.t()): The words to show in Octocat's speech bubble

  ## Resources

    * [API method documentation](https://docs.github.com/rest/reference/meta#get-octocat)

  """
  @spec get_octocat(keyword) :: {:ok, binary} | {:error, GitHub.Error.t()}
  def get_octocat(opts \\ []) do
    client = opts[:client] || @default_client
    query = Keyword.take(opts, [:s])

    client.request(%{
      call: {GitHub.Meta, :get_octocat},
      url: "/octocat",
      method: :get,
      query: query,
      response: [{200, :binary}],
      opts: opts
    })
  end

  @doc """
  Get the Zen of GitHub

  ## Resources

    * [API method documentation](https://docs.github.com/rest/meta#get-the-zen-of-github)

  """
  @spec get_zen(keyword) :: {:ok, binary} | {:error, GitHub.Error.t()}
  def get_zen(opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      call: {GitHub.Meta, :get_zen},
      url: "/zen",
      method: :get,
      response: [{200, :binary}],
      opts: opts
    })
  end

  @doc """
  GitHub API Root

  ## Resources

    * [API method documentation](https://docs.github.com/rest/overview/resources-in-the-rest-api#root-endpoint)

  """
  @spec root(keyword) :: {:ok, GitHub.Root.t()} | {:error, GitHub.Error.t()}
  def root(opts \\ []) do
    client = opts[:client] || @default_client

    client.request(%{
      call: {GitHub.Meta, :root},
      url: "/",
      method: :get,
      response: [{200, {GitHub.Root, :t}}],
      opts: opts
    })
  end
end