lib/signing/psbt/input_list.ex

defmodule BitcoinLib.Signing.Psbt.InputList do
  alias BitcoinLib.Signing.Psbt.Input

  # TODO: document
  def extract(keypair_lists) do
    keypair_lists
    |> call()
    |> validate_result()
    |> extract_values()
  end

  defp call(keypair_lists) do
    keypair_lists
    |> Enum.map(&Input.from_keypair_list/1)
  end

  defp validate_result(computed_inputs) do
    error =
      computed_inputs
      |> Enum.find_value(fn input ->
        Map.get(input, :error)
      end)

    case error do
      nil -> {:ok, computed_inputs}
      message -> {:error, message}
    end
  end

  defp extract_values({:error, message}), do: {:error, message}

  defp extract_values({:ok, computed_inputs}) do
    inputs =
      computed_inputs
      |> Enum.filter(&(!is_nil(&1)))

    {:ok, inputs}
  end
end