api/validate: Add require_any validator.
BUG=None
TEST=run_pytest
Change-Id: I4f9a6be8f6d99bbaa12c8ec4a1fa170823585511
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/2595826
Tested-by: Alex Klein <saklein@chromium.org>
Reviewed-by: Michael Mortensen <mmortensen@google.com>
Commit-Queue: Alex Klein <saklein@chromium.org>
diff --git a/api/validate.py b/api/validate.py
index d8a075d..0f61a39 100644
--- a/api/validate.py
+++ b/api/validate.py
@@ -132,6 +132,35 @@
return decorator
+# pylint: disable=docstring-misnamed-args
+def require_any(*fields):
+ """Verify at least one of |fields| have been set.
+
+ Args:
+ fields (str): The fields being checked. May be . separated nested fields.
+ """
+ assert fields
+
+ def decorator(func):
+ @functools.wraps(func)
+ def _require(input_proto, output_proto, config, *args, **kwargs):
+ if config.do_validation:
+ for field in fields:
+ logging.debug('Validating %s is set.', field)
+ value = _value(field, input_proto)
+ if value:
+ break
+ else:
+ cros_build_lib.Die('At least one of the following must be set: %s',
+ ', '.join(fields))
+
+ return func(input_proto, output_proto, config, *args, **kwargs)
+
+ return _require
+
+ return decorator
+
+
def require_each(field, subfields, allow_empty=True):
"""Verify |field| each have all of the |subfields| set.