summaryrefslogtreecommitdiff
path: root/kvmd/validators/__init__.py
diff options
context:
space:
mode:
authorDevaev Maxim <[email protected]>2019-04-06 05:32:02 +0300
committerDevaev Maxim <[email protected]>2019-04-06 08:04:26 +0300
commit1d75b738a08c98a5d3d8ac3c685e77360f4c1267 (patch)
tree3aa89dc7fd0ab737e9332714a784e9d4dde0a362 /kvmd/validators/__init__.py
parent73e04b71ed55a46c939f12548b31746617af2bca (diff)
validators, tests
Diffstat (limited to 'kvmd/validators/__init__.py')
-rw-r--r--kvmd/validators/__init__.py83
1 files changed, 83 insertions, 0 deletions
diff --git a/kvmd/validators/__init__.py b/kvmd/validators/__init__.py
new file mode 100644
index 00000000..f4b0f1fa
--- /dev/null
+++ b/kvmd/validators/__init__.py
@@ -0,0 +1,83 @@
+# ========================================================================== #
+# #
+# KVMD - The main Pi-KVM daemon. #
+# #
+# Copyright (C) 2018 Maxim Devaev <[email protected]> #
+# #
+# This program is free software: you can redistribute it and/or modify #
+# it under the terms of the GNU General Public License as published by #
+# the Free Software Foundation, either version 3 of the License, or #
+# (at your option) any later version. #
+# #
+# This program is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# GNU General Public License for more details. #
+# #
+# You should have received a copy of the GNU General Public License #
+# along with this program. If not, see <https://www.gnu.org/licenses/>. #
+# #
+# ========================================================================== #
+
+
+import re
+
+from typing import List
+from typing import Callable
+from typing import NoReturn
+from typing import Any
+
+
+# =====
+class ValidatorError(ValueError):
+ pass
+
+
+# =====
+def raise_error(arg: Any, name: str, hide: bool=False) -> NoReturn:
+ arg_str = " "
+ if not hide:
+ arg_str = (" %r " if isinstance(arg, (str, bytes)) else " '%s' ") % (arg)
+ raise ValidatorError("The argument" + arg_str + "is not a valid " + name)
+
+
+def check_not_none(arg: Any, name: str) -> Any:
+ if arg is None:
+ raise ValidatorError("Empty argument is not a valid %s" % (name))
+ return arg
+
+
+def check_not_none_string(arg: Any, name: str, strip: bool=True) -> str:
+ arg = str(check_not_none(arg, name))
+ if strip:
+ arg = arg.strip()
+ return arg
+
+
+def check_in_list(arg: Any, name: str, variants: List) -> Any:
+ if arg not in variants:
+ raise_error(arg, name)
+ return arg
+
+
+def check_string_in_list(arg: Any, name: str, variants: List[str], lower: bool=True) -> Any:
+ arg = check_not_none_string(arg, name)
+ if lower:
+ arg = arg.lower()
+ return check_in_list(arg, name, variants)
+
+
+def check_re_match(arg: Any, name: str, pattern: str, strip: bool=True, hide: bool=False) -> str:
+ arg = check_not_none_string(arg, name, strip=strip)
+ if re.match(pattern, arg, flags=re.MULTILINE) is None:
+ raise_error(arg, name, hide=hide)
+ return arg
+
+
+def check_any(arg: Any, name: str, validators: List[Callable[[Any], Any]]) -> Any:
+ for validator in validators:
+ try:
+ return validator(arg)
+ except Exception:
+ pass
+ raise_error(arg, name)