Current section

Files

Jump to
jsv lib jsv resolver internal.ex
Raw

lib/jsv/resolver/internal.ex

defmodule JSV.Resolver.Internal do
@behaviour JSV.Resolver
@moduledoc """
A `JSV.Resolver` implementation that resolves URIs pointing to the application
code base or JSV code base.
A custom resolver implementation should delegate `jsv:` prefixed URIs to this
module to enable support of the internal resolutions features.
### Module based schemas
This resolver will resolve `jsv:module:MODULE` URIs where `MODULE` is a string
representation of an Elixir module. Modules pointed at with such references
MUST export a `schema/0` function that returns a normalized (with binary keys
and values) JSON schema.
"""
alias JSV.AtomTools
@impl true
def resolve(url, opts)
def resolve("jsv:module:" <> module_string, _) do
case cast_to_existing_atom(module_string) do
{:ok, module} -> {:ok, AtomTools.deatomize(module.schema())}
{:error, reason} -> {:error, {:invalid_schema_module, reason}}
end
rescue
e -> {:error, {:invalid_schema_module, Exception.message(e)}}
end
defp cast_to_existing_atom(module_string) do
{:ok, String.to_existing_atom(module_string)}
rescue
_ -> {:error, "not an existing atom: #{module_string}"}
end
end