Current section

Files

Jump to
pi_bridge lib pi target result.ex
Raw

lib/pi/target/result.ex

defmodule Pi.Target.Result do
@moduledoc false
alias Pi.Eval.Output, as: EvalOutput
alias Pi.Protocol.Tool.Eval, as: EvalPayload
alias Pi.Protocol.Tool.OutputPart
def text({:ok, %{text: text, ok: true}}), do: {:ok, text}
def text({:ok, %{text: text, ok: false}}), do: {:error, text}
def text({:error, reason}), do: {:error, error_text(reason)}
def structured({:ok, %{ok: true} = result}) do
parts =
[]
|> maybe_io_part(result.io)
|> Kernel.++([
OutputPart.inspect(result.result,
language: :elixir,
title: result.preview,
data:
result.result
|> Pi.Syntax.metadata(language: :elixir)
|> Map.put(:runtime, result.runtime)
)
])
{:ok,
%EvalPayload{
io: result.io,
result: result.result,
diagnostics: result.diagnostics,
text: result.text,
parts: parts,
display: EvalOutput.display(parts),
bindings: result.bindings,
state: Map.put(result.state, :runtime, result.runtime)
}}
end
def structured({:ok, %{ok: false} = result}) do
parts = [] |> maybe_io_part(result.io) |> Kernel.++([OutputPart.error(result.text)])
{:error,
%EvalPayload{
io: result.io,
error: result.text,
exception: result.exception,
diagnostics: result.diagnostics,
text: result.text,
parts: parts,
display: EvalOutput.display(parts),
bindings: result.bindings,
state: Map.put(result.state, :runtime, result.runtime)
}}
end
def structured({:error, reason}), do: {:error, error_text(reason)}
defp maybe_io_part(parts, ""), do: parts
defp maybe_io_part(parts, io), do: parts ++ [OutputPart.text(io)]
defp error_text(%{message: message}) when is_binary(message), do: message
defp error_text(reason), do: inspect(reason, pretty: true)
end