boolean-type-parser.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import {DataType} from '../data-type.js';
  2. import {DataParsingError} from '../errors/index.js';
  3. /**
  4. * Boolean type parser.
  5. *
  6. * @param {*} value
  7. * @param {object} schema
  8. * @param {object|undefined} options
  9. * @returns {*}
  10. */
  11. export function booleanTypeParser(value, schema, options) {
  12. // если тип не соответствует логическому
  13. // значению, то преобразование пропускается
  14. if (schema.type !== DataType.BOOLEAN) {
  15. return value;
  16. }
  17. // если значение является логическим,
  18. // то преобразование пропускается
  19. if (typeof value === 'boolean') {
  20. return value;
  21. }
  22. // если значение является строкой,
  23. // то выполняется попытка преобразования
  24. if (typeof value === 'string') {
  25. value = value.trim();
  26. if (value === '1') return true;
  27. if (value === '0') return false;
  28. if (value === 'true') return true;
  29. if (value === 'false') return false;
  30. }
  31. // если значение является числом,
  32. // то выполняется попытка преобразования
  33. else if (typeof value === 'number') {
  34. if (value === 1) return true;
  35. if (value === 0) return false;
  36. }
  37. // если значение не определено,
  38. // то преобразование пропускается
  39. if (value == null) {
  40. return value;
  41. }
  42. // если преобразовать значение не удалось,
  43. // то выбрасывается ошибка
  44. if (!options || !options.noParsingErrors) {
  45. const sourcePath = options && options.sourcePath;
  46. const dataType = schema.type || DataType.ANY;
  47. throw new DataParsingError(value, dataType, sourcePath);
  48. }
  49. // если установлен флаг бесшумной работы,
  50. // то значение возвращается без изменений
  51. return value;
  52. }