//@ts-check

/**
 * Utility: use it at the end of switch statements to make sure all matches are covered.
 * Only useful in an editor that supports JSDOC strong typing.
 *
 * Use it like so
 * ```js
 * switch(data):
 *  case A:
 *    doThing();
 *    break;
 *  case B:
 *    doOtherThing();
 *    break;
 *  default:
 *    throw new UnreachableCaseError(state);
 * ```
 * It `data` may be more options, then `state` will be underlined with the error
 * ```
 * Argument of type 'T' is not assignable to parameter of type 'never'
 * ```
 * Where `T` is the type of `data`.
 * To remove the error, handle all cases.
 */
export class UnreachableCaseError extends Error {
  constructor(/** @type {never} */ value) {
    super(`Unreachable case: ${JSON.stringify(value)}`);
  }
}

export default UnreachableCaseError