lib/crc32c.ex

defmodule Crc32c do
  @moduledoc """
  the crc32c algorithm. It uses a rust nif.
  """
  alias Crc32c.Impl

  @doc """
  Calculate the CRC.

  Expect binary data.

  #### Examples

      iex> Crc32c.calc(<<1, 2, 3, 4>>)
      {:ok, 691047668}

      iex> Crc32c.calc(5)
      {:error, :not_binary_data}
  """
  @spec calc(binary()) :: {:ok, integer()} | {:error, :not_binary_data}
  def calc(data) when is_binary(data), do: {:ok, Impl.calc(data)}

  def calc(_data) do
    {:error, :not_binary_data}
  end

  @doc """
  Calculate the CRC. It raises an Argument error if data is not binary

  Expect binary data.

  #### Examples

      iex> Crc32c.calc!(<<1, 2, 3, 4>>)
      691047668
  """
  @spec calc!(binary()) :: integer() | no_return()
  def calc!(data), do: Impl.calc(data)
end