defmodule SayCheezEx.Graphs.Graphviz do
alias SayCheezEx.Graphs.Provider
@behaviour Provider
@moduledoc """
Calls a local graphviz command and renders the graph.
"""
@impl true
def render!(s),
do:
render(s)
|> Provider.display()
@impl true
def render(recipe) do
Provider.rebuild_if_needed("gv", recipe, &generate_content_graphviz_local/1)
end
def generate_content_graphviz_local(recipe) do
dot_file = Provider.to_temp_file(recipe, "dotfile")
svg_file = "#{dot_file}.svg"
case Provider.run_cmd("dot", ["-Tsvg", "-o#{svg_file}", dot_file]) do
b when is_binary(b) ->
case File.read(svg_file) do
{:ok, content} ->
{:ok,
content
|> Provider.clean_up_svg()
|> Provider.wrap_in_div_for_valid_markdown()}
{:error, e} ->
{:error, "Something went wrong: #{inspect(e)}"}
end
{:error, e} ->
{:error, "Something went wrong running dot: #{inspect(e)}"}
end
end
end