import re EMAIL_VALIDATOR = re.compile(r'([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+') class InputMenu: def __init__(self, title): self._title = title self._fields = [] def add_option(self, key, title, type, value, min, max, validator): self._fields.append({"key": key, "title": title, "type": type, "value": value, "min": min, "max": max, "validator": validator}) return self def do_input(self): print("") print(f"/--[ {self._title} ]-------------") for i in range(len(self._fields)): data = None while True: data = "" if self._fields[i]['value'] == None: data = input(f"| ({self._fields[i]['title']}) => ") else: data = input(f"| ({self._fields[i]['title']}) [{self._fields[i]['value']}] => ") if self._fields[i]['type'] == "STR": # Check if value was preset and entered value was not changed if self._fields[i]['value'] != None and data == "": break # Check length if len(data) >= self._fields[i]['min'] and len(data) <= self._fields[i]['max']: # Check regex validator id used if self._fields[i]['validator'] != None: if re.fullmatch(self._fields[i]['validator'], data): # Set value of current field self._fields[i]['value'] = data break else: print("| Invalid input! Try again. \n|") continue # Set value of current field self._fields[i]['value'] = data break print("| Invalid input! Try again. \n|") continue elif self._fields[i]['type'] == "INT": # Check if value was preset and entered value was not changed if self._fields[i]['value'] != None and data == "": break # Try and parse string into int, set value if no errors occur try: num = int(data) if num >= self._fields[i]['min'] and num <= self._fields[i]['max']: self._fields[i]['value'] = data break else: print("| Invalid input! Try again. \n|") except: print("| Invalid input! Try again. \n|") else: exit("Invalid input type!") print(f"\-------------------------------") print("") return self def get_value(self, key): for i in range(len(self._fields)): if self._fields[i]["key"] == key: return self._fields[i]["value"] return None