defmodule Mix.Tasks.Wac.Install do @moduledoc """ Generates schemas, migrations, and contexts for users with WebauthnComponents as the primary authentication mechanism. """ @shortdoc "Generates a user schema." use Mix.Task alias Wac.Gen.Contexts alias Wac.Gen.Schemas alias Wac.Gen.Migrations alias Wac.Gen.Tests alias Wac.Gen.Fixtures @version Mix.Project.config()[:version] @mix_task "wac.install" @switches [] @impl Mix.Task def run([version]) when version in ~w(-v --version) do Mix.shell().info("WebauthnComponents Schemas generator v#{@version}") end def run([version]) when version in ~w(-h --help) do Mix.Tasks.Help.run([@mix_task]) end def run(args) do if Mix.Project.umbrella?() do Mix.shell().error("Sorry, umbrella projects are currently unsupported.") end case OptionParser.parse(args, strict: @switches) do {_parsed, _args, []} -> dirname = File.cwd!() |> Path.basename() dirname_camelized = Macro.camelize(dirname) assigns = [ app_snake_case: dirname, app_pascal_case: Module.concat([dirname_camelized]) ] Schemas.copy_templates(assigns) Migrations.copy_templates(assigns) Contexts.copy_templates(assigns) Tests.copy_templates(assigns) Fixtures.copy_templates(assigns) {_parsed, _args, errors} -> invalid_opts = errors |> Enum.map_join(", ", &elem(&1, 0)) Mix.Tasks.Help.run([@mix_task]) Mix.shell().error("Invalid option(s): #{invalid_opts}") end end end