defmodule BitcoinLib.Key.HD.DerivationPath.PathValues do
@moduledoc """
Single purpose module that's responsible to transform a list of integer into
a DerivationPath values structure
"""
@enforce_keys [:type]
defstruct [:type, :purpose, :network, :account, :change, :address_index]
alias BitcoinLib.Key.HD.DerivationPath.PathValues
@type t :: PathValues
@doc """
Transform a list of integer into a DerivationPath values structure
## Examples
iex> ["m", 0x80000000, 0x80000000, 0x80000005]
...> |> BitcoinLib.Key.HD.DerivationPath.PathValues.from_list
%BitcoinLib.Key.HD.DerivationPath.PathValues{
type: "m",
purpose: 0x80000000,
network: 0x80000000,
account: 0x80000005
}
"""
@spec from_list(list()) :: PathValues.t()
def from_list([type | remaining_values]) do
{purpose, remaining_values} = extract_first_value(remaining_values)
{network, remaining_values} = extract_first_value(remaining_values)
{account, remaining_values} = extract_first_value(remaining_values)
{change, remaining_values} = extract_first_value(remaining_values)
{address_index, _remaining_values} = extract_first_value(remaining_values)
%PathValues{
type: type,
purpose: purpose,
network: network,
account: account,
change: change,
address_index: address_index
}
end
defp extract_first_value([]), do: {nil, []}
defp extract_first_value([first_value]), do: {first_value, []}
defp extract_first_value([first_value | remaining_list]) do
{first_value, remaining_list}
end
end