43 lines
1.3 KiB
Elixir
43 lines
1.3 KiB
Elixir
defmodule Mix.Tasks.GenerateOpenNebulaRecords do
|
|
use Mix.Task
|
|
|
|
@moduledoc """
|
|
Generate erlang records from OpenNebula's XSD templates. Inspired from
|
|
http://codesinger.blogspot.com/2015/12/elixir-erlang-records-and-erlsom-xml.html
|
|
"""
|
|
|
|
@opennebula_release "5.12"
|
|
|
|
@shortdoc "Generate erlang records from OpenNebula's XSD templates"
|
|
def run(_) do
|
|
priv_dir = to_string(:code.priv_dir(:meta))
|
|
xsd_dir = Path.join([priv_dir, "opennebula", @opennebula_release, "xsd-src"])
|
|
hrl_dir = Path.join([priv_dir, "opennebula", @opennebula_release, "xsd-records"])
|
|
|
|
files = xsd_dir
|
|
|> File.ls!()
|
|
|> Enum.filter(fn filename -> String.ends_with?(filename, ".xsd") end)
|
|
|> Enum.sort()
|
|
|
|
# Delete existing hrl headers.
|
|
if File.exists?(hrl_dir) do
|
|
File.rm_rf!(hrl_dir)
|
|
end
|
|
File.mkdir_p(hrl_dir)
|
|
|
|
for xsd_filename <- files do
|
|
hrl_filename = String.replace_trailing(xsd_filename, ".xsd", ".hrl")
|
|
|
|
xsd_file = Path.join([xsd_dir, xsd_filename]) |> String.to_charlist
|
|
hrl_file = Path.join([hrl_dir, hrl_filename]) |> String.to_charlist
|
|
|
|
IO.write "> Processing #{xsd_filename}... "
|
|
try do
|
|
:erlsom.write_xsd_hrl_file(xsd_file, hrl_file, [])
|
|
IO.puts "OK"
|
|
catch
|
|
e -> IO.puts "Error: #{inspect(e)}"
|
|
end
|
|
end
|
|
end
|
|
end
|