lib/waffle/storage/google/url.ex

defmodule Waffle.Storage.Google.Url do
  @moduledoc """
  Defines an interface for generating Google Cloud Storage URLs.
  """

  alias Waffle.Types

  @doc """
  Constructs a URL based on data from Waffle.
  """
  @callback build(
    definition :: Types.definition,
    version :: Types.version,
    meta :: Types.meta,
    options :: Keyword.t
  ) :: String.t

  defmacro __using__(_) do
    quote do
      @behaviour Waffle.Storage.Google.Url
      @before_compile Waffle.Storage.Google.Url
    end
  end

  defmacro __before_compile__(_) do
    quote do
      @doc """
      Same as `build(definition, version, meta, [])`.
      """
      @spec build(Types.definition, Types.version, Types.meta) :: String.t
      def build(definition, version, meta), do: build(definition, version, meta, [])
    end
  end
end