dynamodb-toolbox
Version:
Lightweight and type-safe query builder for DynamoDB and TypeScript.
121 lines (120 loc) • 5.6 kB
JavaScript
import { DynamoDBToolboxError } from '../../../../../errors/index.js';
import { Parser } from '../../../../../schema/actions/parse/index.js';
import { formatArrayPath } from '../../../../../schema/actions/utils/formatArrayPath.js';
import { NumberSchema } from '../../../../../schema/number/schema.js';
import { isArray } from '../../../../../utils/validation/isArray.js';
import { $ADD, $SUBTRACT, $SUM, isAddition, isSubtraction, isSum } from '../../symbols/index.js';
import { parseReferenceExtension } from './reference.js';
export const parseNumberExtension = (schema, inputValue, { transform = true, valuePath } = {}) => {
const { props } = schema;
if (isSum(inputValue) && inputValue[$SUM] !== undefined) {
return {
isExtension: true,
*extensionParser() {
const sumElements = inputValue[$SUM];
const sumValuePath = [...(valuePath !== null && valuePath !== void 0 ? valuePath : []), '$SUM'];
if (!isArray(sumElements) || sumElements.length !== 2) {
const path = formatArrayPath(sumValuePath);
throw new DynamoDBToolboxError('parsing.invalidAttributeInput', {
message: `Sum for number attribute ${path !== undefined ? `'${path}' ` : ''}should be a tuple of length 2`,
path,
payload: { received: inputValue[$SUM] }
});
}
const [left, right] = sumElements;
const parsers = [
new Parser(new NumberSchema({ big: props.big })).start(left, {
fill: false,
transform,
parseExtension: parseReferenceExtension,
valuePath: [...sumValuePath, 0]
}),
new Parser(new NumberSchema({ big: props.big })).start(right, {
fill: false,
transform,
parseExtension: parseReferenceExtension,
valuePath: [...sumValuePath, 1]
})
];
const parsedValue = { [$SUM]: parsers.map(parser => parser.next().value) };
if (transform) {
yield parsedValue;
}
else {
return parsedValue;
}
const transformedValue = { [$SUM]: parsers.map(parser => parser.next().value) };
return transformedValue;
}
};
}
if (isSubtraction(inputValue) && inputValue[$SUBTRACT] !== undefined) {
return {
isExtension: true,
*extensionParser() {
const subtractElements = inputValue[$SUBTRACT];
const subtractValuePath = [...(valuePath !== null && valuePath !== void 0 ? valuePath : []), '$SUBTRACT'];
if (!isArray(subtractElements) || subtractElements.length !== 2) {
const path = formatArrayPath(subtractValuePath);
throw new DynamoDBToolboxError('parsing.invalidAttributeInput', {
message: `Subtraction for number attribute ${path !== undefined ? `'${path}' ` : ''}should be a tuple of length 2`,
path,
payload: {
received: inputValue[$SUBTRACT]
}
});
}
const [left, right] = subtractElements;
const parsers = [
new Parser(new NumberSchema({ big: props.big })).start(left, {
fill: false,
transform,
parseExtension: parseReferenceExtension,
valuePath: [...subtractValuePath, 0]
}),
new Parser(new NumberSchema({ big: props.big })).start(right, {
fill: false,
transform,
parseExtension: parseReferenceExtension,
valuePath: [...subtractValuePath, 1]
})
];
const parsedValue = { [$SUBTRACT]: parsers.map(parser => parser.next().value) };
if (transform) {
yield parsedValue;
}
else {
return parsedValue;
}
const transformedValue = { [$SUBTRACT]: parsers.map(parser => parser.next().value) };
return transformedValue;
}
};
}
if (isAddition(inputValue) && inputValue[$ADD] !== undefined) {
const parser = new Parser(new NumberSchema({ big: props.big })).start(inputValue[$ADD], {
fill: false,
transform,
parseExtension: parseReferenceExtension,
valuePath: [...(valuePath !== null && valuePath !== void 0 ? valuePath : []), '$ADD']
});
return {
isExtension: true,
*extensionParser() {
const parsedValue = { [$ADD]: parser.next().value };
if (transform) {
yield parsedValue;
}
else {
return parsedValue;
}
const transformedValue = { [$ADD]: parser.next().value };
return transformedValue;
}
};
}
return {
isExtension: false,
unextendedInput: inputValue
};
};