lib/signing/psbt/input/partial_sig.ex

defmodule BitcoinLib.Signing.Psbt.Input.PartialSig do
  defstruct [:pub_key, :signature]

  @compressed_size 33
  @uncompressed_size 65

  alias BitcoinLib.Signing.Psbt.Input.PartialSig

  # TODO: document
  def parse(pub_key, signature) do
    %{pub_key: pub_key, signature: signature}
    |> validate_pub_key()
    |> create_partial_sig()
  end

  defp validate_pub_key(%{pub_key: pub_key} = map) do
    case byte_size(pub_key) do
      @compressed_size ->
        map

      @uncompressed_size ->
        map

      pub_key_size ->
        Map.put(map, :error, "wrong pub key size at #{pub_key_size}")
    end
  end

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

  defp create_partial_sig(%{pub_key: pub_key, signature: signature} = map) do
    partial_sig = %PartialSig{
      pub_key: pub_key,
      signature: signature
    }

    map
    |> Map.put(partial_sig, partial_sig)
  end
end