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