lib/kino_kroki/samples.ex

defmodule Kino.Kroki.Samples do
  @samples_file :code.priv_dir(:kino_kroki)
                |> Path.join("samples.txt")

  @external_resource @samples_file
  @samples_separator ~r/<--- sample:(?<type>.+) --->\n/m
  @samples @samples_file
           |> File.read!()
           |> String.split(@samples_separator,
             include_captures: true,
             trim: true
           )
           |> Enum.chunk_every(2)
           |> Enum.map(fn
             [separator, diagram] ->
               {String.to_atom(Regex.named_captures(@samples_separator, separator)["type"]),
                String.trim(diagram)}
           end)
           |> Map.new()

  @type type :: unquote(Enum.reduce(Map.keys(@samples), &{:|, [], [&1, &2]}))

  @moduledoc """
  Parses and makes samples easy to access.

  Samples for the following diagram types are available:

  #{for {type, _} <- @samples, into: "", do: "* `#{type}` \n"}
  """

  @doc "Return all the samples"
  @spec all :: map()
  def all, do: @samples

  @doc "Fetch a sample by diagram type"
  @spec get(type :: String.t() | type) :: String.t() | nil
  def get(type) when is_atom(type), do: @samples[type]
  def get(type) when is_bitstring(type), do: get(String.to_existing_atom(type))
end