Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature request - sequential validations #278

Open
lindyhopchris opened this issue Jan 15, 2021 · 8 comments
Open

Feature request - sequential validations #278

lindyhopchris opened this issue Jan 15, 2021 · 8 comments

Comments

@lindyhopchris
Copy link

Using #220 as inspiration, I'm frequently using this custom validator in my code:

export default function validateChain(validators) {
  return async (key, value, oldValue, changes, content) => {
    let result;
    let index = 0;

    do {
      let validator = validators[index++];
      result = await validator(key, value, oldValue, changes, content);
    } while (true === result && index < validators.length);

    return result;
  };
}

My use case is exactly the same as the linked issue - I have expensive async custom validators that there's no point calling if other validators fail. Example use case:

import {
  validatePresence,
  validateFormat
} from 'ember-changeset-validations/validators';
import validateChain from '../validators/chain';
import validateUniqueEmail from '../validators/unique-email';

export default {
  email: validateChain([
    validatePresence(true),
    validateFormat({ type: 'email' }),
    validateUniqueEmail(),
  ]),
};

I think this sequential validator is really useful as this use case is common. So my question is - would you accept a PR adding it to this package?

If yes, then two questions:

  1. What would you like the validator to be called?
  2. How should I be checking for object validators? Just checking for the existence of a validate function?
@BryanCrotaz
Copy link

I have exactly the same issue - +1 for me

@BryanCrotaz
Copy link

Are your expensive validators server-side? If so how are you dealing with authentication without access to services?

@BryanCrotaz
Copy link

Maybe a better fix would be a default feature to run all sync validators first and only run async validators if the sync ones all pass?

@lindyhopchris
Copy link
Author

@BryanCrotaz I'm using fetch for the async validators, and have utility functions to configure the fetch to work with the server. Luckily it works without a service: it would be better implemented if I could use a service.

@snewcomer
Copy link
Collaborator

@lindyhopchris That would be a great addition to this library. Perhaps exported from validators/index.

@lindyhopchris
Copy link
Author

@snewcomer great, I'll put together a PR. Hopefully I should have some open source time this coming week to sort it out.

@snewcomer
Copy link
Collaborator

@lindyhopchris Lmk if this is something you still want to take on! Happy to do it if you are busy.

@lindyhopchris
Copy link
Author

@snewcomer I am still happy to do it, but not sure quite when I can get to it. Possibly this week.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants