defmodule BitcoinLib.Signing.Psbt.GenericProperties.WitnessScript do
defstruct [:script]
alias BitcoinLib.Signing.Psbt.GenericProperties.WitnessScript
alias BitcoinLib.Signing.Psbt.Keypair
alias BitcoinLib.Signing.Psbt.Keypair.{Key}
alias BitcoinLib.Script
# TODO: document
@spec parse(%Keypair{}) :: {:ok, %WitnessScript{}} | {:error, binary()}
def parse(keypair) do
%{keypair: keypair, witness_script: %WitnessScript{}}
|> validate_keypair()
|> extract_witness_script()
|> create_output
end
defp create_output(%{error: message}), do: {:error, message}
defp create_output(%{witness_script: witness_script}), do: {:ok, witness_script}
defp validate_keypair(%{keypair: keypair, witness_script: witness_script} = map) do
case keypair.key do
%Key{data: <<>>} ->
map
_ ->
%{
map
| witness_script: Map.put(witness_script, :error, "invalid witnessscript typed key")
}
end
end
defp extract_witness_script(%{witness_script: %{error: _message} = witness_script}),
do: witness_script
defp extract_witness_script(%{keypair: keypair} = map) do
case Script.parse(keypair.value.data) do
{:ok, script} ->
Map.put(map, :witness_script, %WitnessScript{script: script})
{:error, message} ->
Map.put(map, :error, message)
end
end
end