| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- import {DataType} from '../data-type.js';
- import {ServiceContainer} from '@e22m4u/js-service';
- import {DataParsingError} from '../errors/index.js';
- import {EmptyValuesService} from '@e22m4u/js-empty-values';
- /**
- * Object type parser.
- *
- * @param {*} value
- * @param {object} schema
- * @param {options|undefined} options
- * @param {ServiceContainer} container
- * @returns {*}
- */
- export function objectTypeParser(value, schema, options, container) {
- // если тип не соответствует объекту,
- // то проверка пропускается
- if (schema.type !== DataType.OBJECT) {
- return value;
- }
- // если значение является объектом,
- // то проверка пропускается
- if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
- return value;
- }
- // если значение является строкой,
- // то выполняется попытка преобразования
- if (typeof value === 'string') {
- value = value.trim();
- let newValue;
- try {
- newValue = JSON.parse(value);
- } catch {
- //
- }
- if (
- newValue !== null &&
- typeof newValue === 'object' &&
- !Array.isArray(newValue)
- ) {
- return newValue;
- }
- }
- // если значение является пустым,
- // то преобразование пропускается
- const dataType = schema.type || DataType.ANY;
- const emptyValues = container.get(EmptyValuesService);
- if (emptyValues.isEmptyByType(dataType, value)) {
- return value;
- }
- // если преобразовать значение не удалось,
- // то выбрасывается ошибка
- if (!options || !options.noParsingErrors) {
- const sourcePath = options && options.sourcePath;
- throw new DataParsingError(value, dataType, sourcePath);
- }
- // если установлен флаг бесшумной работы,
- // то значение возвращается без изменений
- return value;
- }
|