Skip to content

Commit

Permalink
Added optional schema type
Browse files Browse the repository at this point in the history
  • Loading branch information
GrzegorzManiak committed Jun 24, 2024
1 parent 5649860 commit f3fd469
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 15 deletions.
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "noise_validator",
"version": "1.2.16",
"version": "1.2.17",
"main": "./src/index.ts",
"license": "MIT",
"author": {
Expand Down
59 changes: 49 additions & 10 deletions src/schema/types/optional.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import GenericType from '../generic';
import { GenericError } from 'noise_validator/src/error';
import { SchemaNamespace } from '../types.d';
import Schema from '../schema';



Expand All @@ -21,12 +22,16 @@ class OptionalTypeClass<
OriginalInputShape
> {
_default_value: ExtractReturnType<DefaultValue, OriginalReturnType> | undefined;
_original_constructor: SchemaNamespace.GenericTypeConstructor<OriginalReturnType, OriginalInputShape>;
_original_constructor:
SchemaNamespace.GenericTypeConstructor<OriginalReturnType, OriginalInputShape> |
SchemaNamespace.SchemaLike;
_input_value: OriginalInputShape;

constructor(
input_value: unknown,
original_constructor: SchemaNamespace.GenericTypeConstructor<OriginalReturnType, OriginalInputShape>,
original_constructor:
SchemaNamespace.GenericTypeConstructor<OriginalReturnType, OriginalInputShape> |
SchemaNamespace.SchemaLike,
default_value?: DefaultValue
) {
super(input_value);
Expand All @@ -35,6 +40,26 @@ class OptionalTypeClass<
this._original_constructor = original_constructor;
}



public async _validate_data(data: unknown): Promise<OriginalReturnType> {
switch (this._original_constructor instanceof Schema) {
case true: {
const schema = this._original_constructor as SchemaNamespace.SchemaLike<OriginalReturnType>;
const validated_data = await schema.validate(data);
return validated_data;
}

case false: {
const constructor = this._original_constructor as SchemaNamespace.GenericTypeConstructor<OriginalReturnType, OriginalInputShape>;
const instance = new constructor(data);
const result = await instance.execute();
if (result.success === true) return result.data;
else throw result.data;
}
}
};



public async handler(): Promise<ExtractReturnType<DefaultValue, OriginalReturnType> | undefined> {
Expand All @@ -54,11 +79,19 @@ class OptionalTypeClass<
};


// -- Attempt to execute the original constructor
const instance = new this._original_constructor(this._input_value)
const result = await instance.execute();
if (result.success === true) return result.data;
throw result.data;
// -- Validate the data
try {
const validated_data = await this._validate_data(this.value);
return validated_data;
}

// -- Add a hint if it fails
catch (unkown_error) {
const error = GenericError.from_unknown(unkown_error);
error.hint = 'Error occurred while validating the schema';
error.data = { expected: this.constructor.name, value: this.value };
throw error;
}
}

catch (unknown_error) {
Expand All @@ -79,15 +112,21 @@ class OptionalTypeClass<
const create_optional = <
OriginalReturnType,
OriginalInputShape,
DefaultValue extends OriginalReturnType | undefined,
DefaultValue extends (
OriginalReturnType extends SchemaNamespace.SchemaLike ?
SchemaNamespace.ReturnType<OriginalReturnType> :
OriginalReturnType
) | undefined,
>(
constructor: SchemaNamespace.GenericTypeConstructor<
OriginalReturnType,
OriginalInputShape
>,
> | OriginalReturnType,
default_value: DefaultValue = undefined as DefaultValue
) => (class extends OptionalTypeClass<
OriginalReturnType,
OriginalReturnType extends SchemaNamespace.SchemaLike ?
SchemaNamespace.ReturnType<OriginalReturnType> :
OriginalReturnType,
OriginalInputShape,
DefaultValue
> {
Expand Down
4 changes: 2 additions & 2 deletions tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const testschema = new nv.Schema({


const testschema2 = new nv.Schema({
a: nv.String,
a: nv.Optional(testschema3, {z:'balls'}),
b: nv.Array(nv.Boolean)
});

Expand Down Expand Up @@ -57,7 +57,7 @@ nv.Binder(route, 'GET', {
url,
body
}) => {
console.log(body.b[0]);
console.log(body.a);
});


Expand Down

0 comments on commit f3fd469

Please sign in to comment.