lib/supabase/storage_behaviour.ex

defmodule Supabase.StorageBehaviour do
  @moduledoc "Defines Supabase Storage Client callbacks"

  alias Supabase.Storage.Bucket
  alias Supabase.Storage.Object
  alias Supabase.Storage.ObjectOptions, as: Opts
  alias Supabase.Storage.SearchOptions, as: Search

  @type conn :: atom
  @type reason :: String.t() | atom
  @type result(a) :: {:ok, a} | {:error, reason} | {:error, :invalid_client}

  @callback list_buckets(conn) :: result([Bucket.t()])
  @callback retrieve_bucket_info(conn, id) :: result(Bucket.t())
            when id: String.t()
  @callback create_bucket(conn, map) :: result(Bucket.t())
  @callback update_bucket(conn, Bucket.t(), map) :: result(Bucket.t())
  @callback empty_bucket(conn, Bucket.t()) :: result(:emptied)
  @callback delete_bucket(conn, Bucket.t()) :: result(:deleted)

  @callback remove_object(conn, Bucket.t(), Object.t()) :: result(:deleted)
  @callback move_object(conn, Bucket.t(), Object.t(), String.t()) :: result(:moved)
  @callback copy_object(conn, Bucket.t(), Object.t(), String.t()) :: result(:copied)
  @callback retrieve_object_info(conn, Bucket.t(), String.t()) :: result(Object.t())
  @callback list_objects(conn, Bucket.t(), prefix, Search.t()) :: result([Object.t()])
            when prefix: String.t()
  @callback upload_object(conn, Bucket.t(), dest, source, Opts.t()) :: result(Object.t())
            when dest: String.t(),
                 source: Path.t()
  @callback download_object(conn, Bucket.t(), wildcard) :: result(binary)
            when wildcard: String.t()
  @callback download_object_lazy(conn, Bucket.t(), wildcard) :: result(Stream.t())
            when wildcard: String.t()
  @callback save_object(conn, dest, Bucket.t(), wildcard) ::
              :ok | {:error, atom} | {:error, :invalid_client}
            when wildcard: String.t(),
                 dest: Path.t()
  @callback save_object_stream(conn, dest, Bucket.t(), wildcard) ::
              :ok | {:error, atom} | {:error, :invalid_client}
            when wildcard: String.t(),
                 dest: Path.t()
  @callback create_signed_url(conn, Bucket.t(), String.t(), integer) :: result(String.t())
end