Current section

Files

Jump to
forge_abi lib mix tasks gen_error_code.ex
Raw

lib/mix/tasks/gen_error_code.ex

defmodule Mix.Tasks.ForgeAbi.GenErrorCode do
@moduledoc """
Generate error code
"""
@output_folder Path.join(File.cwd!(), "priv")
@output_summary_file Path.join(@output_folder, "error.md")
@input_file Path.join(File.cwd!(), "lib/protobuf/status_code.yml")
# output is from `make all-txs` in forge-core-protocols
@all_txs ~w(declare account_migrate create_asset acquire_asset consume_asset update_asset deploy_protocol upgrade_node stake exchange transfer deposit_tether exchange_tether withdraw_tether approve_tether revoke_tether poke setup_swap retrieve_swap revoke_swap delegate)
def run(_argv) do
write_error_files()
end
# private functions
defp write_error_files do
parsed_file = parse_error_yml()
write_to_summary("# Status Code\n\n")
for {code_name, info} <- parsed_file do
prepare_for_code(code_name)
case is_binary(info) do
true -> handle_default_code(code_name, info)
false -> handle_tx_codes(info, code_name)
end
copy_default(code_name)
end
end
defp handle_default_code(code_name, info) do
write_to_summary("#{info}\n\n")
File.write(Path.join(@output_folder, "error_code/#{code_name}/default.md"), "#{info}")
end
defp handle_tx_codes(info, code_name) do
for {tx_name, tx_msg} <- info, do: handle_tx_code(code_name, tx_name, tx_msg)
end
defp handle_tx_code(code_name, tx_name, tx_msg) do
single_file = Path.join(@output_folder, "error_code/#{code_name}/#{tx_name}.md")
File.write(single_file, "#{tx_msg}")
write_to_summary("### `#{tx_name}`\n\n")
write_to_summary("#{tx_msg}\n\n")
end
defp prepare_for_code(code_name) do
write_to_summary("## `#{code_name}`\n\n")
File.mkdir_p(Path.join(@output_folder, "error_code/#{code_name}"))
end
defp parse_error_yml do
case YamlElixir.read_from_file(@input_file) do
{:ok, file} -> file
{:error, _} -> IO.puts("Fail to parse the status_code.yml file.")
end
end
defp write_to_summary(content) do
File.write(@output_summary_file, content, [:append])
end
defp copy_default(code_name) do
base_path = Path.join(@output_folder, "error_code/#{code_name}")
default = Path.join(base_path, "default.md")
@all_txs
|> Enum.map(&Path.join(base_path, "#{&1}.md"))
|> Enum.reject(&File.exists?/1)
|> Enum.each(&File.copy!(default, &1))
end
end