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; }