defmodule Tracer.Formatter do
@moduledoc """
Tracer format and io functions.
"""
import Tracer.Utils
def start_link(io, formatter) do
spawn_link(__MODULE__, :init, [io, formatter])
end
def init({init_fun, handle_fun}, formatter) when is_function(init_fun) or is_tuple(init_fun) do
io = apply_func(init_fun)
loop({io, handle_fun}, formatter)
end
def init({io, handle_fun}, formatter) when is_pid(io) do
loop({io, handle_fun}, formatter)
end
defp loop(io_spec, formatter) do
receive do
{:formatter, new_formatter} ->
loop(io_spec, new_formatter)
{:flush, pid} ->
flush_messages(io_spec, formatter, pid)
msg ->
format_and_print(io_spec, formatter, msg)
loop(io_spec, formatter)
end
end
defp flush_messages(io_spec, formatter, pid) do
receive do
msg ->
format_and_print(io_spec, formatter, msg)
flush_messages(io_spec, formatter, pid)
after
0 ->
send(pid, :flushed)
loop(io_spec, formatter)
end
end
defp format_and_print({io, handle_fun}, formatter, msg) do
with formatted_string when is_binary(formatted_string) <- apply_func(formatter, msg) do
apply_func(handle_fun, [io, formatted_string])
end
end
end