From 42978bf0b5beebb3a49797d3d800a2c3e4b0c5e9 Mon Sep 17 00:00:00 2001
From: "(quasar) nebula" <qznebula@protonmail.com>
Date: Sat, 30 Dec 2023 15:46:44 -0400
Subject: validators: embed is() in oneOf()

---
 src/data/things/validators.js | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

(limited to 'src')

diff --git a/src/data/things/validators.js b/src/data/things/validators.js
index 6add3655..0cc20229 100644
--- a/src/data/things/validators.js
+++ b/src/data/things/validators.js
@@ -192,13 +192,17 @@ export function is(...values) {
     };
   }
 
-  return (value) => {
+  const fn = (value) => {
     if (!values.has(value)) {
       throw new TypeError(`Expected one of ${Array.from(values).join(' ')}, got ${value}`);
     }
 
     return true;
   };
+
+  setValidatorCreatorMeta(fn, is, {values});
+
+  return fn;
 }
 
 function validateArrayItemsHelper(itemValidator) {
@@ -603,6 +607,7 @@ export const isAdditionalNameList = validateArrayItems(isAdditionalName);
 // Compositional utilities
 
 export function oneOf(...validators) {
+  const validConstants = new Set();
   const validConstructors = new Set();
   const validTypes = new Set();
 
@@ -613,6 +618,12 @@ export function oneOf(...validators) {
     const creatorMeta = getValidatorCreatorMeta(validator);
 
     switch (creator) {
+      case is:
+        for (const value of creatorMeta.values) {
+          validConstants.add(value);
+        }
+        break;
+
       case validateInstanceOf:
         validConstructors.add(creatorMeta.constructor);
         break;
@@ -630,6 +641,10 @@ export function oneOf(...validators) {
   return (value) => {
     const errorInfo = [];
 
+    if (validConstants.has(value)) {
+      return true;
+    }
+
     if (!empty(validTypes)) {
       if (validTypes.has(typeof value)) {
         return true;
@@ -663,6 +678,20 @@ export function oneOf(...validators) {
 
     let offset = 0;
 
+    if (!empty(validConstants)) {
+      const constants =
+        Array.from(validConstants);
+
+      const gotPart = `, got ${value}`;
+
+      prefaceErrorInfo.push([
+        null,
+        offset++,
+        new TypeError(
+          `Expected one of ${constants.join(' ')}` + gotPart),
+      ]);
+    }
+
     if (!empty(validTypes)) {
       const types =
         Array.from(validTypes);
-- 
cgit 1.3.0-6-gf8a5