ExParamsSchema.Type behaviour (ex_params_schema v0.1.0)

Copy Markdown View Source

独自型を ExParamsSchema のフィールドとして利用するための仕様です。

adapter は外部入力をドメイン値またはプリミティブ値へ変換し、その値を JSON Schema 検証用の JSON 互換の値へ変換します。標準制約の検証は adapter ではなく ex_json_schema が担当します。

typespec/0 を実装すると、生成される params 構造体のフィールド型を AST で指定できます。 実装しない場合は、struct adapter の t/0 を参照し、それ以外は dynamic() として扱われます。

最小の adapter は必須 callback 3 つを実装します。

defmodule MyApp.TrimmedString do
  @behaviour ExParamsSchema.Type

  @impl true
  def cast(value, _options) when is_binary(value), do: {:ok, String.trim(value)}
  def cast(_value, _options), do: {:error, :not_a_string}

  @impl true
  def to_json(value, _options), do: value

  @impl true
  def json_schema(_options), do: %{"type" => "string"}

  @impl true
  def typespec, do: quote(do: String.t())
end

フィールドでは {Module, adapter_options} を型として指定します。フィールド option は外側の tuple に指定します。

field :slug, {MyApp.TrimmedString, []}, min_length: 1, error: :invalid_slug

Summary

Callbacks

外部入力を adapter の値へ変換します。変換不能な場合は {:error, detail} を返します。

adapter の値に対応する追加の JSON Schema を返します。

adapter の値を JSON Schema 検証用の JSON 互換値へ変換します。

生成される params 構造体のフィールド型を表す AST を返します。

変換済みの adapter 値に固有の制約を適用します。

フィールド宣言に渡された adapter 固有の option を検証します。

Types

cast_result()

@type cast_result() :: {:ok, value :: term()} | {:error, detail :: term()}

json_array()

@type json_array() :: [json_value()]

json_object()

@type json_object() :: %{required(String.t()) => json_value()}

json_value()

@type json_value() ::
  boolean() | number() | String.t() | nil | json_array() | json_object()

Callbacks

cast(input, options)

@callback cast(input :: term(), options :: keyword()) :: cast_result()

外部入力を adapter の値へ変換します。変換不能な場合は {:error, detail} を返します。

json_schema(options)

@callback json_schema(options :: keyword()) :: map() | boolean()

adapter の値に対応する追加の JSON Schema を返します。

to_json(value, options)

@callback to_json(value :: term(), options :: keyword()) :: json_value()

adapter の値を JSON Schema 検証用の JSON 互換値へ変換します。

typespec()

(optional)
@callback typespec() :: Macro.t()

生成される params 構造体のフィールド型を表す AST を返します。

validate(value, options)

(optional)
@callback validate(value :: term(), options :: keyword()) ::
  :ok | {:error, detail :: term()}

変換済みの adapter 値に固有の制約を適用します。

validate_options(options)

(optional)
@callback validate_options(options :: keyword()) :: :ok | {:error, String.t()}

フィールド宣言に渡された adapter 固有の option を検証します。