Skip to content

cozy-elixir/cozy_params

Repository files navigation

CozyParams

CI Hex.pm built with Nix

Provides Ecto-like API for casting and validating params.

Why another package?

There are some packages in the community:

NAME Based on Ecto? Use Ecto-like API?
params YES NO
maru_params NO NO
tarams NO NO
...

But, they don't fit my requirements. The package in my dream should:

  • be based on Ecto which is robust and battle-tested.
  • use Ecto-like API, which eliminates friction when working on casting params and modeling data source at the same time.

Installation

Add :cozy_params to the list of dependencies in mix.exs:

def deps do
  [
    {:cozy_params, "<requirement>"}
  ]
end

(Optional) And, it's encouraged to setup .formatter.exs for cozy_params:

[
  import_deps: [
    # ...
    :cozy_params
  ],
  # ...
]

Overview

  • CozyParams - provides macros for general usage.
  • CozyParams.Schema - provides macros for defining schemas directly.

An example integrating with Phoenix:

defmodule DemoWeb.PageController do
  use DemoWeb, :controller
  import CozyParams

  action_fallback DemoWeb.FallbackController

  defparams :product_search do
    field :name, :string, required: true

    embeds_many :tags do
      field :name, :string, required: true
    end
  end

  def index(conn, params) do
    with {:ok, data} <- product_search(params) do
      # ...
    end
  end
end

defmodule DemoWeb.FallbackController do
  use DemoWeb, :controller

  # ...

  # handle errors for cozy_params
  def call(conn, {:error, params_changeset: %Ecto.Changeset{} = changeset}) do
    messages = CozyParams.get_error_messages(changeset)
    # render messages in HTML, JSON, etc.
  end

  # handle errors for normal changsets from Ecto.
  def call(conn, {:error, %Ecto.Changeset{} = changeset}) do
    # ...
  end

  # ...
end

Visit HexDocs for more details.

License

Apache License 2.0

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks