lib/ex_aws/event_bridge.ex

defmodule ExAws.EventBridge do
  @moduledoc """
  Operations on AWS EventBridge service.

  ## Notes
  Based on API spec at https://github.com/aws/aws-sdk-go/blob/main/models/apis/eventbridge/2015-10-07/api-2.json

  Options for requests are passed as a keyword list of underscored atoms, with names matching the API spec above.

  Example: The ListEventBuses request accepts an optional "NamePrefix". Example of this request in this library:
  ```elixir
  ExAws.EventBridge.list_event_buses(name_prefix: "my_prefix")
  ```
  """

  alias ExAws.Operation.JSON

  @target_prefix "AWSEvents"

  @doc """
  List event buses

  ## Example
  ```
  EventBridge.list_event_buses() |> ExAws.request()
  EventBridge.list_event_buses(name_prefix: "my_prefix") |> ExAws.request()
  ```
  """
  @spec list_event_buses(opts :: Keyword.t()) :: JSON.t()
  def list_event_buses(opts \\ []) do
    request(:list_event_buses, opts_to_data(opts))
  end

  @doc """
  Create an event bus

  ## Example
  ```
  EventBridge.create_event_bus("new-bus") |> ExAws.request()
  ```
  """
  @spec create_event_bus(name :: binary, opts :: Keyword.t()) :: JSON.t()
  def create_event_bus(name, opts \\ []) do
    data =
      %{"Name" => name}
      |> Map.merge(opts_to_data(opts))

    request(:create_event_bus, data)
  end

  @doc """
  Delete an event bus

  ## Example
  ```
  EventBridge.delete_event_bus("old-bus") |> ExAws.request()
  ```
  """
  @spec delete_event_bus(name :: binary, opts :: Keyword.t()) :: JSON.t()
  def delete_event_bus(name, opts \\ []) do
    data =
      %{"Name" => name}
      |> Map.merge(opts_to_data(opts))

    request(:delete_event_bus, data)
  end

  @doc """
  Describe an event bus

  ## Example
  ```
  EventBridge.describe_event_bus("my-bus") |> ExAws.request()
  ```
  """
  @spec describe_event_bus(name :: binary, opts :: Keyword.t()) :: JSON.t()
  def describe_event_bus(name, opts \\ []) do
    data =
      %{"Name" => name}
      |> Map.merge(opts_to_data(opts))

    request(:describe_event_bus, data)
  end

  @spec put_events(event_list :: List.t(), opts :: Keyword.t()) :: JSON.t()
  def put_events(event_list, opts \\ []) do
    data =
      %{"Entries" => Enum.map(event_list, fn event -> opts_to_data(event) end)}
      |> Map.merge(opts_to_data(opts))

    request(:put_events, data)
  end

  defp opts_to_data(_opts = []), do: %{}

  defp opts_to_data(opts) do
    opts
    |> Enum.into(%{}, fn {k, v} -> {atom_to_string(k), v} end)
  end

  defp request(operation, data, opts \\ %{}) do
    JSON.new(
      :events,
      %{
        data: data,
        headers: headers(operation)
      }
      |> Map.merge(opts)
    )
  end

  defp headers(operation) do
    [
      {"x-amz-target", "#{@target_prefix}.#{atom_to_string(operation)}"},
      {"content-type", "application/x-amz-json-1.1"}
    ]
  end

  defp atom_to_string(string) do
    string
    |> Atom.to_string()
    |> Macro.camelize()
  end
end