kindling/lib/kindling/templates.ex
2024-04-12 10:16:58 -05:00

54 lines
1.6 KiB
Elixir

defmodule Kindling.Templates do
@moduledoc """
Template functions for generating FHIR Resource modules.
"""
require EEx
import Kindling.Templates.Functions
import Kindling.Schema.Resource
alias Kindling.Schema.Resource
EEx.function_from_file(:def, :render, "lib/kindling/template.eex", [:assigns])
EEx.function_from_file(:def, :render_embedded, "lib/kindling/embed_template.eex", [:assigns])
def resource_code(namespace, version, roots, resource_name, resource) do
assigns = %{
namespace: namespace,
version: version,
resource_name: resource_name,
properties: Resource.grouped_properties(resource, roots),
all_fields: Resource.all_fields(resource),
required_fields: Resource.required_fields(resource),
backlinks: Enum.filter(resource["__backlinks"], &(&1 in roots))
}
if resource_name in roots do
assigns
|> render()
|> Code.format_string!(file: "#{resource_name}.ex")
else
assigns
|> render_embedded()
|> Code.format_string!(file: "#{resource_name}.ex")
end
end
def write_code(namespace, version, roots, resource_name, resource) do
dir = Path.join(["lib", String.downcase(namespace), String.downcase(version)])
file = Path.join([dir | to_source_file_name(resource_name)])
File.mkdir_p!(Path.dirname(file))
File.write!(file, resource_code(namespace, version, roots, resource_name, resource))
end
def to_source_file_name(resource_name) do
resource_name
|> String.split("_")
|> Enum.reverse()
|> Enum.map(&Recase.to_snake/1)
|> then(fn [hd | tail] -> ["#{hd}.ex" | tail] end)
|> Enum.reverse()
end
end