lib/signing/psbt/generic_properties/redeem_script.ex

defmodule BitcoinLib.Signing.Psbt.GenericProperties.RedeemScript do
  defstruct [:script]

  alias BitcoinLib.Signing.Psbt.GenericProperties.RedeemScript
  alias BitcoinLib.Signing.Psbt.Keypair
  alias BitcoinLib.Signing.Psbt.Keypair.{Key}
  alias BitcoinLib.Script

  # TODO: document
  @spec parse(%Keypair{}) :: {:ok, %RedeemScript{}} | {:error, binary()}
  def parse(keypair) do
    %{keypair: keypair}
    |> validate_keypair()
    |> extract_redeem_script()
    |> create_output()
  end

  defp create_output(%{error: message}), do: {:error, message}
  defp create_output(%{redeem_script: redeem_script}), do: {:ok, redeem_script}

  defp validate_keypair(%{keypair: keypair} = map) do
    case keypair.key do
      %Key{data: <<>>} ->
        map

      _ ->
        Map.put(map, :error, "invalid redeemscript typed key")
    end
  end

  defp extract_redeem_script(%{error: _message} = map),
    do: map

  defp extract_redeem_script(%{keypair: keypair} = map) do
    case Script.parse(keypair.value.data) do
      {:ok, script} ->
        Map.put(map, :redeem_script, %RedeemScript{script: script})

      {:error, message} ->
        Map.put(map, :error, message)
    end
  end
end