Packages

helijia Skylab deployment package

Current section

Files

Jump to
helijia_skylab lib skylab generate.ex
Raw

lib/skylab/generate.ex

defmodule Skylab.Generate do
import Skylab.Template, only: [input_path: 2, output_path: 2]
@moduledoc """
Generate Skylab configurations from command line.
Usage:
```sh
mix skylab.gen --app my_app
```
"""
@defaults [
app: "my_app",
output: "."
]
def gen(opts) do
with {:opts, {:ok, opts}} <- {:opts, deal_with_default_opts(opts)},
{:dir, :ok} <- {:dir, gen_output_dir(opts)},
{:ci_config, :ok} <- {:ci_config, gen_ci_config(opts)},
{:config, :ok} <- {:config, gen_config(opts)},
{:docker_file, :ok} <- {:docker_file, gen_docker_file(opts)} do
:ok
end
end
defp deal_with_default_opts(opts) do
{:ok, Keyword.merge(@defaults, opts)}
end
defp gen_output_dir(opts) do
opts
|> Keyword.get(:output)
|> gen_dir()
end
defp gen_ci_config(opts) do
input = input_path("gitlab-ci.yml", opts)
with out <- EEx.eval_file(input, opts),
:ok <- gen_gitlab_ci_config(out, opts) do
:ok
end
end
defp gen_dir(file) do
File.mkdir_p(file)
end
defp gen_gitlab_ci_config(content, opts) do
".gitlab-ci.yml"
|> output_path(opts)
|> File.write!(content)
end
defp gen_config(opts) do
inputs = ~w[
config/skylab.exs
rel/secret.exs
]
for input <- inputs do
template = input_path(input, opts)
:ok =
input
|> output_path(opts)
|> prepair_dir()
|> File.write!(EEx.eval_file(template, opts))
end
:ok
end
defp prepair_dir(file) do
file
|> Path.dirname()
|> File.mkdir_p()
file
end
defp gen_docker_file(opts) do
input = input_path("Dockerfile", opts)
"Dockerfile"
|> output_path(opts)
|> File.write!(EEx.eval_file(input, opts))
end
end