formats/json/parser.js

const {
  isString,
  isDefinedOrThrow,
  isStringOrObjectOrThrow
} = require("../../bindings/http/validation/fun.js");
const ValidationError = require("../../bindings/http/validation/validation_error.js");

const invalidPayloadTypeError = new ValidationError("invalid payload type, allowed are: string or object");
const nullOrUndefinedPayload = new ValidationError("null or undefined payload");

const asJSON = (v) => (isString(v) ? JSON.parse(v) : v);

class JSONParser {
  constructor(decorator) {
    this.decorator = decorator;
  }

  /**
   * Parses the payload with an optional decorator
   * @param {object|string} payload the JSON payload
   * @return {object} the parsed JSON payload.
   */
  parse(payload) {
    if (this.decorator) {
      payload = this.decorator.parse(payload);
    }

    isDefinedOrThrow(payload, nullOrUndefinedPayload);
    isStringOrObjectOrThrow(payload, invalidPayloadTypeError);
    return asJSON(payload);
  }
}

module.exports = JSONParser;