Skip to content

Commit

Permalink
refactor: simplify parser mechanism
Browse files Browse the repository at this point in the history
  • Loading branch information
IdoBouskila committed Aug 18, 2024
1 parent 58f594c commit 2487048
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 17 deletions.
11 changes: 6 additions & 5 deletions src/schema/numberSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,24 @@ import initializeParsers from './utils/initializeParsers';
import { ensureNumber, ensureNumberSize } from '../utils/validations';

function numberSchema() {
const { parse, registerParser } = initializeParsers<number>(ensureNumber);
const { parse, safeParse, registerParser } = initializeParsers<number>(ensureNumber);

return {
parse,
safeParse,
min: function (requiredSize: number) {
registerParser((value: unknown) => ensureNumberSize({
registerParser((value) => ensureNumberSize({
requiredSize,
value: value as number,
value: value,
validationType: 'min',
}));

return this;
},
max: function (requiredSize: number) {
registerParser((value: unknown) => ensureNumberSize({
registerParser((value) => ensureNumberSize({
requiredSize,
value: value as number,
value: value,
validationType: 'max',
}));

Expand Down
8 changes: 4 additions & 4 deletions src/schema/stringSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,18 @@ function stringSchema() {
return {
parse,
min: function (requiredLength: number) {
registerParser((value: unknown) => ensureStringLength({
registerParser((value) => ensureStringLength({
value: value,
requiredLength,
value: value as string,
validationType: 'min',
}));

return this;
},
max: function (requiredLength: number) {
registerParser((value: unknown) => ensureStringLength({
registerParser((value) => ensureStringLength({
value: value,
requiredLength,
value: value as string,
validationType: 'max',
}));

Expand Down
19 changes: 11 additions & 8 deletions src/schema/utils/initializeParsers.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
const initializeParsers = <T>(initialParser: (value: unknown) => T) => {
const parserFunctions = new Set<(value: unknown) => T>([initialParser]);
type RestParsers<T> = (value: T) => T;
type FirstParser<T> = (value: unknown) => T;

const initializeParsers = <T>(initialParser: FirstParser<T>) => {
const parserFunctions = new Set<RestParsers<T>>([]);

const parse = (value: unknown) => {
let validatedValue: T = value as T;
let validatedValue = initialParser(value);

for (const parser of parserFunctions) {
validatedValue = parser(value);
}
for(const parser of parserFunctions) {
validatedValue = parser(validatedValue);
};

return validatedValue;
};

const registerParser = (parser: (value: unknown) => T) => parserFunctions.add(parser);
const registerParser = (parser: RestParsers<T>) => parserFunctions.add(parser);

return {
parse,
registerParser,
Expand Down

0 comments on commit 2487048

Please sign in to comment.