Current section
Files
Jump to
Current section
Files
lib/iconvex/extras/application.ex
defmodule Iconvex.Extras.Application do
@moduledoc false
use Application
@provider :euc_jisx0213
@provider_app :iconvex_extras
@registry_priority 100
@impl true
def start(_type, _args) do
case register_provider() do
{:ok, provider_token} ->
start_with_provider(provider_token)
error ->
error
end
end
@impl true
def stop(%{codec_token: codec_token, provider_token: provider_token}) do
unregister_codecs(codec_token)
unregister_provider(provider_token)
:ok
end
def stop(_state), do: :ok
defp start_with_provider(provider_token) do
case register_codecs() do
{:ok, codec_token} ->
case Supervisor.start_link([], strategy: :one_for_one) do
{:ok, supervisor} ->
{:ok, supervisor, %{codec_token: codec_token, provider_token: provider_token}}
error ->
rollback_start(codec_token, provider_token)
error
end
{:error, error} ->
rollback_start(nil, provider_token)
{:error, error}
end
end
defp register_provider do
case Iconvex.Tables.register_provider_owned(@provider, @provider_app) do
{:ok, :existing} -> {:ok, nil}
{:ok, token} -> {:ok, token}
error -> error
end
end
defp register_codecs do
Iconvex.ExternalRegistry.register_set_owned(Iconvex.Extras.codecs(),
owner: @provider_app,
priority: @registry_priority
)
end
defp rollback_start(codec_token, provider_token) do
unregister_codecs(codec_token)
unregister_provider(provider_token)
end
defp unregister_codecs(token) when is_reference(token),
do: Iconvex.ExternalRegistry.unregister_set(token)
defp unregister_codecs(nil), do: :ok
defp unregister_provider(token) when is_reference(token),
do: Iconvex.Tables.unregister_provider(@provider, @provider_app, token)
defp unregister_provider(nil), do: :ok
end