lib/mete/connection/httpc.ex

defmodule Mete.Connection.Httpc do
  @behaviour Mete.Connection

  import IO, only: [iodata_to_binary: 1]

  alias Mete.Config

  defstruct [
    :token,
    :uri,
    :influx_version
  ]

  @impl true
  def init(%Config{influx_version: 1} = config) do
    if is_binary(config.database) do
      uri = Config.uri(config)

      {:ok, %__MODULE__{influx_version: 1, uri: uri}}
    else
      {:error, :database_missing}
    end
  end

  def init(%Config{influx_version: 2} = config) do
    if is_binary(config.bucket) and is_binary(config.organisation) and is_binary(config.token) do
      uri = Config.uri(config)

      {:ok, %__MODULE__{influx_version: 2, uri: uri, token: "Token #{config.token}"}}
    else
      {:error, :database_missing}
    end
  end

  @impl true
  def transmit(payload, %__MODULE__{uri: uri, token: token}) do
    body = iodata_to_binary(payload)

    headers =
      if is_binary(token) do
        [{'Authorization', token}]
      else
        []
      end

    :httpc.request(:post, {uri, headers, 'text-plain; charset=utf-8', body}, [], [])
  end

  @impl true
  def batch_size(_) do
    nil
  end
end