defmodule Yemux do alias Yemux.{Error, Partial, Session} @moduledoc """ ## Synopsis # Yemux creates a string of shell commands that create or connect to a TMUX session. It exposes a single function `main` which takes a symbol as first parameter which allows to dispatch to the according functions and a list of additional parameters. ## Subcommands ### `:yemux` """ def main(dispatch, args) def main(:yemux, args) do _yemux(args) end def main(:partial, args) do case _partial(args) do [_ | _] = list -> list |> List.flatten() |> Enum.join("\n") string -> string end end defp _partial([partial_name, partial_filename]) do case YamlElixir.read_from_file(partial_filename) do {:ok, partials} -> _partial_from_hash(partial_name, partials, partial_filename) {:error, %{message: message}} -> raise Error.BadYamlFile, message end end def _partial_from_hash(partial_name, partials, partial_filename) do case Partial.render_partial(partial_name, partials) do {:ok, output} -> output {:error, message} -> raise Error.BadPartialDefinition, Enum.join([message, partial_filename], " ") end end defp _yemux(args) defp _yemux([yml_filename, cfg_filename]) do case YamlElixir.read_from_file(cfg_filename) do {:ok, config} -> _yemux([yml_filename], config) {:error, %{message: message}} -> raise Error.BadYamlFile, message end end defp _yemux([filename], config \\ nil) do case YamlElixir.read_from_file(filename) do {:ok, yaml} -> _yemux_create(filename, yaml, config) {:error, %{message: message}} -> raise Error.BadYamlFile, message end end defp _yemux_create(filename, yaml, config) do case Session.new(filename, yaml, config) |> Session.create() do {:ok, list} -> list |> List.flatten() |> Enum.join("\n") {:error, message} -> raise Error.BadSessionSpec, message end end end # SPDX-License-Identifier: Apache-2.0