lib/aptos/cli_parser.ex

defmodule Web3AptosEx.Aptos.CliParser do
  import NimbleParsec

  @moduledoc """
    aptos CLI commands:
      $ aptos move init
  """

  aptos_signal =
    string("aptos")

  aptos_move_signal =
    string("aptos move")
  space = ascii_string([?\s], min: 0) |> ignore()
  name_param_signal =
    string("--name")
    |> ignore(space)
    |> concat(ascii_string([?_, ?0..?9, ?a..?z, ?A..?Z], min: 0))

  defparsec :cmd,
    choice([
      aptos_move_signal,
      aptos_signal
    ])
    |> ignore(space)
    |> optional() # behaviours
    |> optional(name_param_signal), debug: true # params
  def parse_cmd(cmd_str) do
    with {:ok, result, _, _, _, _} <- cmd(cmd_str) do
      {[first_arg], others} = Enum.split(result, 1)
      do_parse_cmd(first_arg, others)
    end
  end

  def do_parse_cmd("aptos", params), do: handle_aptos(params)
  def do_parse_cmd("aptos move", params), do: handle_aptos_move(params)

  def handle_aptos(params) do
    :aptos
  end

  def handle_aptos_move(params) do
    :aptos_move
  end
end