nehero

nehero

Validate - simple & flexible input validation

Hey! One thing I’ve been struggling with since switching to elixir and phoenix is validating incoming request data, whether it be from an API route or an html form. Coming from the Laravel world, I was used to having a powerful request validation system baked in that isn’t tied to your data schema.

So I created Validate

GitHub:
https://github.com/ozziexsh/validate

Docs:

TL;DR and examples

Features include:

  • Lots of validation rules built in
  • Custom validation rules via inline functions or modules
  • Plug compatibility (validate and authorise controller actions before reaching the method)
  • Automatically strips keys from maps that aren’t present in the rules, preventing attackers from throwing extraneous data at you
  • Infinite nesting of lists/maps to support complex JSON structures

There are lots of examples in the readme but here’s a quick look at how you could use it:

input = %{
  "email" => "test@example.com",
  "plan" => "free",
  "team" => %{"name" => "Test Team"}
}

rules = %{
  "email" => [required: true, type: :string, max: 50],
  "plan" => [required: true, type: :string, in: ["free", "pro"]],
  "team" => [
    required: true,
    type: :map,
    map: %{"name" => [required: true, type: :string]}
  }
}

# depending on the result
{:ok, data} = Validate.validate(input, rules)
{:error, errors} = Validate.validate(input, rules)

Why not just ecto?

Although you can technically do form validation through ecto changesets directly on your schemas, and embedded changesets for other data, I found I was constantly typing the same stuff over again, and it quickly gets complicated once you start working with nested and optional data.

Why not library x/y/z?

There are a few great validation libraries out there already but I wanted more than seemed to be offered. Stripping extraneous keys, nesting of maps/lists, and built-in plug support were all hard to find in one single library.

Is it fast?

Honestly, not sure. I have not benchmarked it on massive lists or multi-MB payloads yet. Since we are potentially stripping keys out of the input it means we have to keep a second copy of the data as we loop through and validate. I’m sure this could be optimised more than I have it currently, but I am still learning :slight_smile:

Will more validation rules be added?

Yes! Right now I’ve been using Laravel’s validation rules as inspiration for rules but there are still a few missing which I will add over time. In the meantime, if you find that a rule is not present you can write an inline custom validator really easily.


Would love any feedback/critique! I’ve been using elixir off and on over the years but only recently started writing it daily these past few months, so some of the code has room to be improved.

This package was a lot of fun to build :smile:

Most Liked Switch mode

nehero

nehero

you’re right that is a common issue, we could maybe add a built in cast: :integer rule that handles this automatically by trying to cast to the provided type, and returning a validation error if it fails.

in the mean time, you could accomplish this with a custom validation rule that passes the transformed value to the success result like:

rules = %{
  "id" => [
    required: true,
    custom: fn %{ value: value } ->
      case Integer.parse(value) do
        {id, _} -> Validate.Validator.success(id)
        _ -> Validate.Validator.halt("must be an integer")
      end
    end
}

input = %{"id" => "123"}

{:ok, data} = Validate.validate(input, rules)

data["id"] == 123
nehero

nehero

just released v1.3.0 which added a bunch of new validation rules:

  • cast
  • characters
  • ip
  • url
  • uuid
  • date_string
  • ==
  • >
  • >=
  • <
  • <=
Hermanverschooten

Hermanverschooten

I like the library, but one thing that’s been bothering me recently is that when you specifiy an :id in a path, the resulting value in your params will be a string even though you want it to be an integer.
I’d love for the type: :integer check to allow for this and return the integer value.

Last Post!

krishna_vaguelyright

krishna_vaguelyright

Hi! Do we have conditional validation dependent on other fields here?

Where Next?

Trending in Announcing Top

bluzky
You may know https://ui.shadcn.com/, a UI component library for React. I really love it’s design style and components. I’ve built some co...
385 14863 120
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
shahryarjb
The Chelekom project is a library of Phoenix and LiveView components generated via Mix tasks to fit developer needs seamlessly. One of i...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge &amp; Solve. They are GUI (Emerge) and State management (S...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
zachdaniel
Introducing AshStorage! Attachment and file management that slots directly into your resources :smiling_face_with_sunglasses: I had hope...
New

Other Trending Topics Top

type1fool
I just stumbled on a newly redesigned elixir-lang.org. :tada: It looks like @Software_Mansion did the work, and I think it is generally a...
New
akoutmos
@hugobarauna and I (Alex Koutmos) have been hard at work on writing a book on Nerves that takes you from simply blinking LEDs to building...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
bjorng
We want to introduce a new native datatype to Erlang: native records. Although replacing all tuple records with native records is not our...
New
spammy
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
yureehuh
Introduction Founded in 2017 by landscape ecologist and fire mitigation expert Harry Statter, Frontline developed the first fully integra...
New

We're in Beta

About us Mission Statement