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