View Source Configure a loader

A loader returns the data for a remote schema. The remote schemas are defined in a schema like this.

...
  "properties": {
    "int": {"$ref": "http://localhost:1234/int.json"}
  }
...

A loader will be configured like this.

config :xema, loader: My.Loader

A loader is a module which use the behaviour Xema.Loader.

defmodule My.Loader do
  @moduledoc false

  @behaviour Xema.Loader

  @spec fetch(URI.t()) :: {:ok, any} | {:error, any}
  def fetch(uri) do
    case HTTPoison.get(uri) do
      {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
        {:ok, Jason.decode!(body)}

      {:ok, %HTTPoison.Response{status_code: 404}} ->
        {:error, "Remote schema '#{uri}' not found."}

      {:ok, %HTTPoison.Response{status_code: code}} ->
        {:error, "HTTP Error - code: #{code}"}

      {:error, reason} ->
        {:error, reason}
    end
  end
end

The function fetch/1 will be called by Xema and expects an %URI{}. The return value must be a tuple of :ok and the required data for a schema or an error tuple.

File loader

A loader to read schema from the local file system.

In the schema:

...
  "properties": {
    "int": {"$ref": "integer.json"}
  }
...

The loader:

defmodule My.Loader do
  @moduledoc false

  @behaviour Xema.Loader

  @impl Xema.Loader
  def fetch(uri) do
    "path/to/schemas"
    |> Path.join(uri.path)
    |> File.read!()
    |> Jason.decode()
  end
end