Current section

Files

Jump to
corex lib mix tasks corex.design.ex
Raw

lib/mix/tasks/corex.design.ex

defmodule Mix.Tasks.Corex.Design do
use Mix.Task
@shortdoc "Copies Corex design assets"
@moduledoc """
Copies Corex design assets.
mix corex.design
mix corex.design assets/design
mix corex.design --force
mix corex.design --no-designex
"""
@default_target "assets/corex"
@impl Mix.Task
def run(args) do
Mix.Task.run("app.start")
{opts, paths, _} = parse_args(args)
target = List.first(paths) || @default_target
force = Keyword.get(opts, :force, false)
designex = Keyword.get(opts, :designex, true)
validate_source!()
validate_target!(target, force)
maybe_show_designex_info(designex)
copy_design_files(target, designex)
Mix.shell().info("Corex design copied to: #{target}")
end
defp parse_args(args) do
OptionParser.parse(
args,
switches: [
force: :boolean,
designex: :boolean
]
)
end
defp validate_source! do
source = Application.app_dir(:corex, "priv/design")
unless File.exists?(source) do
Mix.raise("Corex priv/design directory not found")
end
end
defp validate_target!(target, force) do
if File.exists?(target) and not force do
Mix.raise("""
#{target} already exists.
Re-run with --force to overwrite.
""")
end
end
defp maybe_show_designex_info(designex) do
if designex and not designex_installed?() do
Mix.shell().info("""
To enable token builds, add to mix.exs:
{:designex, "~> 1.0", only: :dev}
""")
end
end
defp copy_design_files(target, designex) do
source = Application.app_dir(:corex, "priv/design")
remove_if_exists(target)
File.mkdir_p!(target)
File.cp_r!(source, target)
unless designex do
remove_tokens(target)
end
end
defp remove_if_exists(path) do
if File.exists?(path) do
File.rm_rf!(path)
end
end
defp remove_tokens(target) do
tokens_path = Path.join(target, "design")
if File.exists?(tokens_path) do
File.rm_rf!(tokens_path)
end
end
defp designex_installed? do
Code.ensure_loaded?(Designex)
end
end