mirror of
https://github.com/ash-project/igniter.git
synced 2024-09-20 05:22:52 +12:00
95 lines
2.4 KiB
Elixir
95 lines
2.4 KiB
Elixir
defmodule Igniter.Formatter do
|
|
@moduledoc "Codemods and utilities for interacting with `.formatter.exs` files"
|
|
alias Igniter.Code.Common
|
|
alias Sourceror.Zipper
|
|
|
|
@default_formatter """
|
|
# Used by "mix format"
|
|
[
|
|
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
|
|
]
|
|
"""
|
|
|
|
@doc """
|
|
Adds a new dep to the list of imported deps in the root `.formatter.exs`
|
|
"""
|
|
@spec import_dep(Igniter.t(), dep :: atom) :: Igniter.t()
|
|
def import_dep(igniter, dep) do
|
|
igniter
|
|
|> Igniter.include_or_create_elixir_file(".formatter.exs", @default_formatter)
|
|
|> Igniter.update_elixir_file(".formatter.exs", fn zipper ->
|
|
zipper
|
|
|> Zipper.down()
|
|
|> case do
|
|
nil ->
|
|
code =
|
|
quote do
|
|
[import_deps: [unquote(dep)]]
|
|
end
|
|
|
|
Common.add_code(zipper, code)
|
|
|
|
zipper ->
|
|
zipper
|
|
|> Zipper.rightmost()
|
|
|> Igniter.Code.Keyword.put_in_keyword([:import_deps], [dep], fn nested_zipper ->
|
|
Igniter.Code.List.prepend_new_to_list(
|
|
nested_zipper,
|
|
dep
|
|
)
|
|
end)
|
|
|> case do
|
|
{:ok, zipper} ->
|
|
zipper
|
|
|
|
:error ->
|
|
zipper
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
|
|
@doc """
|
|
Adds a new plugin to the list of plugins in the root `.formatter.exs`
|
|
"""
|
|
@spec add_formatter_plugin(Igniter.t(), plugin :: module()) :: Igniter.t()
|
|
def add_formatter_plugin(igniter, plugin) do
|
|
igniter
|
|
|> Igniter.include_or_create_elixir_file(".formatter.exs", @default_formatter)
|
|
|> Igniter.update_elixir_file(".formatter.exs", fn zipper ->
|
|
zipper
|
|
|> Zipper.down()
|
|
|> case do
|
|
nil ->
|
|
code =
|
|
quote do
|
|
[plugins: [unquote(plugin)]]
|
|
end
|
|
|
|
zipper
|
|
|> Common.add_code(code)
|
|
|
|
zipper ->
|
|
zipper
|
|
|> Zipper.rightmost()
|
|
|> Igniter.Code.Keyword.put_in_keyword(
|
|
[:plugins],
|
|
[Spark.Formatter],
|
|
fn nested_zipper ->
|
|
Igniter.Code.List.prepend_new_to_list(
|
|
nested_zipper,
|
|
Spark.Formatter
|
|
)
|
|
end
|
|
)
|
|
|> case do
|
|
{:ok, zipper} ->
|
|
zipper
|
|
|
|
_ ->
|
|
zipper
|
|
end
|
|
end
|
|
end)
|
|
end
|
|
end
|