Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 13 additions & 100 deletions utils/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ def get_int(
val_str = input(prompt).strip()
if not val_str:
if default is not None:
if min_value is not None and default < min_value:
print(f"❌ Default {default} is below minimum {min_value}.")
continue
if max_value is not None and default > max_value:
print(f"❌ Default {default} is above maximum {max_value}.")
continue
return default
print(error_empty)
continue
Expand Down Expand Up @@ -40,6 +46,12 @@ def get_float(
val_str = input(prompt).strip()
if not val_str:
if default is not None:
if min_value is not None and default < min_value:
print(f"❌ Default {default} is below minimum {min_value}.")
continue
if max_value is not None and default > max_value:
print(f"❌ Default {default} is above maximum {max_value}.")
continue
return default
print(error_empty)
continue
Expand All @@ -52,103 +64,4 @@ def get_float(
continue
return val
except ValueError:
print(error_invalid)

def get_non_empty_string(
prompt: str,
default: Optional[str] = None,
error_empty: str = "❌ Error: Input cannot be empty.",
) -> str:
while True:
val_str = input(prompt).strip()
if not val_str:
if default is not None:
return default
print(error_empty)
continue
return val_str

def get_choice(
prompt: str,
choices: List[str],
default: Optional[str] = None,
error_empty: str = "❌ Error: Input cannot be empty.",
error_invalid: Optional[str] = None,
) -> str:
choices_lower = [c.lower() for c in choices]
while True:
val_str = input(prompt).strip()
if not val_str:
if default is not None:
return default
print(error_empty)
continue
if val_str.lower() in choices_lower:
idx = choices_lower.index(val_str.lower())
return choices[idx]
if error_invalid is not None:
print(error_invalid)
else:
print(f"❌ Invalid selection. Please choose from: {', '.join(choices)}")

def get_yes_no(prompt: str, default: Optional[str] = None) -> bool:
while True:
val_str = input(prompt).strip().lower()
if not val_str:
if default is not None:
return default.lower() in ['y', 'yes']
print("❌ Error: Input cannot be empty. Please enter 'y' or 'n'.")
continue
if val_str in ['y', 'yes']:
return True
if val_str in ['n', 'no']:
return False
print("❌ Invalid choice. Please enter 'y' or 'n'.")

def get_int_list(
prompt: str,
min_len: Optional[int] = None,
max_len: Optional[int] = None,
error_empty: str = "❌ Error: Input cannot be empty.",
error_invalid: str = "❌ Error: Please enter valid integers only.",
) -> List[int]:
while True:
val_str = input(prompt).strip()
if not val_str:
print(error_empty)
continue
try:
val_list = [int(x) for x in val_str.split()]
if min_len is not None and len(val_list) < min_len:
print(f"❌ Error: Please enter at least {min_len} numbers.")
continue
if max_len is not None and len(val_list) > max_len:
print(f"❌ Error: Please enter at most {max_len} numbers.")
continue
return val_list
except ValueError:
print(error_invalid)

def get_float_list(
prompt: str,
min_len: Optional[int] = None,
max_len: Optional[int] = None,
error_empty: str = "❌ Error: Input cannot be empty.",
error_invalid: str = "❌ Error: Please enter valid numbers only.",
) -> List[float]:
while True:
val_str = input(prompt).strip()
if not val_str:
print(error_empty)
continue
try:
val_list = [float(x) for x in val_str.split()]
if min_len is not None and len(val_list) < min_len:
print(f"❌ Error: Please enter at least {min_len} numbers.")
continue
if max_len is not None and len(val_list) > max_len:
print(f"❌ Error: Please enter at most {max_len} numbers.")
continue
return val_list
except ValueError:
print(error_invalid)
print(error_invalid)
Loading