lib/signing/psbt/input/final_script_witness.ex

defmodule BitcoinLib.Signing.Psbt.Input.FinalScriptWitness do
  defstruct [:script_witness]

  alias BitcoinLib.Signing.Psbt.Input.FinalScriptWitness
  alias BitcoinLib.Signing.Psbt.Keypair.{Key}

  # TODO: document
  def parse(keypair) do
    %{keypair: keypair, final_script_witness: %FinalScriptWitness{}}
    |> validate_keypair()
    |> extract_final_script_witness()
  end

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

      _ ->
        %{
          map
          | final_script_witness:
              Map.put(final_script_witness, :error, "invalid final script witness typed key")
        }
    end
  end

  defp extract_final_script_witness(%{
         final_script_witness: %{error: _message} = final_script_witness
       }),
       do: final_script_witness

  defp extract_final_script_witness(%{keypair: keypair}) do
    %FinalScriptWitness{script_witness: keypair.value.data}
  end
end