lib/ex_brotli.ex

defmodule ExBrotli do
  mix_config = Mix.Project.config()
  version = mix_config[:version]

  @moduledoc """
  Wrapper functions for interacting with the Rust based brotli library
  """

  use RustlerPrecompiled,
    otp_app: :ex_brotli,
    crate: :ex_brotli,
    base_url: "https://github.com/mfeckie/ex_brotli/releases/download/#{version}",
    force_build: System.get_env("FORCE_COMPILE") in ["1", "true"],
    version: version,
    nif_versions: ["2.15", "2.16", "2.17"],
    targets: [
      "aarch64-apple-darwin",
      "aarch64-unknown-linux-gnu",
      "x86_64-apple-darwin",
      "x86_64-pc-windows-gnu",
      "x86_64-pc-windows-msvc",
      "x86_64-unknown-linux-gnu",
      "x86_64-unknown-linux-musl",
      "arm-unknown-linux-gnueabihf"
    ]

  @doc """
  Compress a binary using brotli

  ## Examples

      iex> ExBrotli.compress("hello")
      {:ok,  <<11, 2, 128, 104, 101, 108, 108, 111, 3>>}
  """
  def compress(_binary), do: :erlang.nif_error(:nif_not_loaded)

  @doc """
  Decompress a binary using brotli

  ## Examples

      iex> ExBrotli.decompress(<<11, 2, 128, 104, 101, 108, 108, 111, 3>>)
      {:ok, "hello"}
  """
  def decompress(_binary), do: :erlang.nif_error(:nif_not_loaded)

  @doc """
  Compress a binary using brotli, raising an error if the compression fails

  see `compress/1` for examples
  """
  def compress!(binary) do
    case compress(binary) do
      {:ok, result} -> result
      {:error, reason} -> raise reason
    end
  end

  @doc """
  Decompress a binary using brotli, raising an error if the decompression fails

  see `decompress/1` for examples
  """
  def decompress!(binary) do
    case decompress(binary) do
      {:ok, result} -> result
      {:error, reason} -> raise reason
    end
  end
end