function numberParser(key) {
  return function (opt) {
    const intOpt = parseInt(opt);
    if (!Number.isInteger(intOpt)) {
      throw new Error(`Key ${key} has invalid value ${opt}`);
    }
    return intOpt;
  };
}

function numberOrBoolParser(key) {
  return function (opt) {
    if (typeof opt === 'boolean') {
      return opt;
    }
    if (opt === 'true') {
      return true;
    }
    if (opt === 'false') {
      return false;
    }
    return numberParser(key)(opt);
  };
}

function numberOrStringParser(key) {
  return function (opt) {
    if (typeof opt === 'string') {
      return opt;
    }
    return numberParser(key)(opt);
  };
}

function objectParser(opt) {
  if (typeof opt == 'object') {
    return opt;
  }
  return JSON.parse(opt);
}

function arrayParser(opt) {
  if (Array.isArray(opt)) {
    return opt;
  } else if (typeof opt === 'string') {
    return opt.split(',');
  } else {
    throw new Error(`${opt} should be a comma separated string or an array`);
  }
}

function moduleOrObjectParser(opt) {
  if (typeof opt == 'object') {
    return opt;
  }
  try {
    return JSON.parse(opt);
  } catch (e) {
    /* */
  }
  return opt;
}

function booleanParser(opt) {
  if (opt == true || opt == 'true' || opt == '1') {
    return true;
  }
  return false;
}

function nullParser(opt) {
  if (opt == 'null') {
    return null;
  }
  return opt;
}

module.exports = {
  numberParser,
  numberOrBoolParser,
  numberOrStringParser,
  nullParser,
  booleanParser,
  moduleOrObjectParser,
  arrayParser,
  objectParser,
};
