lib/supabase/connection_options.ex

defmodule Supabase.ConnectionOptions do
  @moduledoc """
  A changeset for validating and parsing connection options. This is mainly
  used internally by `Supabase` module, but can be used to validate and parse
  connection options manually.
  """

  import Ecto.Changeset

  alias Supabase.Types.Atom

  @type t :: %{
          alias: atom,
          name: atom,
          base_url: String.t(),
          api_key: String.t(),
          access_token: String.t(),
          bucket: struct
        }

  @types %{
    base_url: :string,
    api_key: :string,
    access_token: :string,
    bucket: :map,
    alias: Ecto.ParameterizedType.init(Atom, []),
    name: Ecto.ParameterizedType.init(Atom, [])
  }

  @spec parse(map) :: {:ok, Supabase.ConnectionOptions.t()} | {:error, Ecto.Changeset.t()}
  def parse(attrs) do
    {%{}, @types}
    |> cast(attrs, Map.keys(@types))
    |> validate_required(~w[base_url api_key alias name]a)
    |> apply_action(:parse_connection_options)
  end

  @spec to_connection_info(t) :: Supabase.Connection.params()
  def to_connection_info(data) do
    [
      name: data[:name],
      conn_info: data
    ]
  end
end