summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@baturin.org>2023-05-10 02:41:15 +0100
committerDaniil Baturin <daniil@baturin.org>2023-05-10 03:15:04 +0100
commit9495ac100114b932569592ee5ea2d4c0bba0a2a3 (patch)
tree3f237b2926081ab4ddb892a9d13bc4dc9235dc45 /python
parent70e476760a9c5b42a5d3f8647e3b4ac361472871 (diff)
downloadvyos-1x-9495ac100114b932569592ee5ea2d4c0bba0a2a3.tar.gz
vyos-1x-9495ac100114b932569592ee5ea2d4c0bba0a2a3.zip
vyos.utils: T5195: add vyos.utils.dict.check_mutually_exclusive_options
Diffstat (limited to 'python')
-rw-r--r--python/vyos/utils/dict.py21
1 files changed, 21 insertions, 0 deletions
diff --git a/python/vyos/utils/dict.py b/python/vyos/utils/dict.py
index 66b40d92b..4afc9f54e 100644
--- a/python/vyos/utils/dict.py
+++ b/python/vyos/utils/dict.py
@@ -233,3 +233,24 @@ def dict_to_list(d, save_key_to=None):
collect.append(item)
return collect
+
+def check_mutually_exclusive_options(d, keys, required=False):
+ """ Checks if a dict has at most one or only one of
+ mutually exclusive keys.
+ """
+ present_keys = []
+
+ for k in d:
+ if k in keys:
+ present_keys.append(k)
+
+ # Un-mangle the keys to make them match CLI option syntax
+ from re import sub
+ orig_keys = list(map(lambda s: sub(r'_', '-', s), keys))
+ orig_present_keys = list(map(lambda s: sub(r'_', '-', s), present_keys))
+
+ if len(present_keys) > 1:
+ raise ValueError(f"Options {orig_keys} are mutually-exclusive but more than one of them is present: {orig_present_keys}")
+
+ if required and (len(present_keys) < 1):
+ raise ValueError(f"At least one of the following options is required: {orig_present_keys}")