Current section

Files

Jump to
pi_bridge lib pi project_eval.ex
Raw

lib/pi/project_eval.ex

defmodule Pi.ProjectEval do
@moduledoc "Runs stateful eval snippets in a persistent dependencyless target-project VM."
alias Pi.Project.Context
alias Pi.Target.{Compiler, Connection, Result, Supervisor}
def run(code, opts \\ []) when is_binary(code),
do: code |> run_target(opts) |> Result.text()
def run_structured(code, opts \\ []) when is_binary(code),
do: code |> run_target(opts) |> Result.structured()
def available?, do: Context.current() |> Context.mix_project?()
def compile(opts \\ []), do: Compiler.compile(opts)
def status(opts \\ []) do
context = Context.current(opts)
with {:ok, connection} <- Supervisor.connection(context, profile(opts)) do
Connection.status(connection)
end
end
def reset(session_id, opts \\ []) when is_binary(session_id) do
context = Context.current(opts)
with {:ok, connection} <- Supervisor.connection(context, profile(opts)) do
Connection.request(connection, :reset, %{session_id: session_id})
end
end
defp run_target(code, opts) do
context = Context.current(opts)
with {:ok, connection} <- Supervisor.connection(context, profile(opts)) do
Connection.eval(connection, code, opts)
end
end
defp profile(opts) do
case Keyword.get(opts, :profile, :project) do
profile when profile in [:project, :application] -> profile
_other -> :project
end
end
end