defmodule Mix.Tasks.Ca.New.Model do @moduledoc """ Creates a new model for the clean architecture project $ mix ca.new.model [model_name] Creates a new model with default behaviour name $ mix ca.new.model [model_name] --behaviour $ mix ca.new.model [model_name] --bh Creates a new model with behaviour name $ mix ca.new.model [model name] --behaviour --behaviour-name [behaviour_name] $ mix ca.new.model [model name] --bh --bh-name [behaviour_name] """ alias ScaffoldCa.Core.ApplyModelTemplate alias ScaffoldCa.Utils.DataTypeUtils use Mix.Task @behaviour_string "behaviour" @version Mix.Project.config()[:version] @switches [bh: :boolean, bh_name: :string, behaviour: :boolean, behaviour_name: :string] def run([]) do Mix.Tasks.Help.run(["ca.new.model"]) end def run([version]) when version in ~w(-v --version) do Mix.shell().info([:reset, "Scaffold version ", :green, "v#{@version}"]) end @shortdoc "Creates a new model with empty properties" def run(argv) do case DataTypeUtils.parse_opts(argv, @switches) do {_opts, []} -> Mix.Tasks.Help.run(["ca.new.model"]) {opts, [model_name | _]} -> app_name_getted = Mix.Project.config() |> Keyword.fetch(:app) case app_name_getted do :error -> Mix.shell().error("It is not an elixir project") {:ok, app_name} -> project_app_name = to_string(app_name) create_model(project_app_name, model_name) if opts[:behaviour] || opts[:bh], do: create_behaviour(opts, project_app_name, model_name) end end end defp create_model(project_app_name, model_name) do Mix.shell().info([:green, "* Creating model ", :reset, model_name]) ApplyModelTemplate.create_model(project_app_name, model_name) Mix.shell().info([:green, "* Model ", :reset, model_name, :green, " created"]) end defp create_behaviour(opts, project_app_name, module_name) do behavior_name = if opts[:behavior_name] != nil || opts[:bh_name] != nil do (opts[:behavior_name] || opts[:bh_name]) else "#{module_name}_#{@behaviour_string}" end Mix.shell().info([:green, "* Creating behaviour ", :reset, behavior_name]) ApplyModelTemplate.create_behaviour(project_app_name, behavior_name) Mix.shell().info([:green, "* Behaviour ", :reset, behavior_name, :green, " created"]) end end