From 818575939a2dc7c1d54945f815c74f10ae8f598e Mon Sep 17 00:00:00 2001 From: pdxlocations Date: Fri, 25 Jul 2025 19:02:22 -0700 Subject: [PATCH] automatic types --- contact/ui/control_ui.py | 35 +++++++++++++++++++++------ contact/utilities/input_handlers.py | 4 +-- contact/utilities/validation_rules.py | 31 +++--------------------- 3 files changed, 33 insertions(+), 37 deletions(-) diff --git a/contact/ui/control_ui.py b/contact/ui/control_ui.py index d3f43d2..39e67c7 100644 --- a/contact/ui/control_ui.py +++ b/contact/ui/control_ui.py @@ -150,6 +150,15 @@ def draw_help_window( ) +def get_input_type_for_field(field) -> type: + if field.type in (field.TYPE_INT32, field.TYPE_UINT32, field.TYPE_INT64): + return int + elif field.type in (field.TYPE_FLOAT, field.TYPE_DOUBLE): + return float + else: + return str + + def settings_menu(stdscr: object, interface: object) -> None: curses.update_lines_cols() @@ -268,7 +277,8 @@ def settings_menu(stdscr: object, interface: object) -> None: break elif selected_option == "Export Config File": - filename = get_text_input("Enter a filename for the config file", None) + + filename = get_text_input("Enter a filename for the config file", None, None) if not filename: logging.info("Export aborted: No filename provided.") menu_state.start_index.pop() @@ -327,7 +337,7 @@ def settings_menu(stdscr: object, interface: object) -> None: elif selected_option == "Config URL": current_value = interface.localNode.getURL() - new_value = get_text_input(f"Config URL is currently: {current_value}", None) + new_value = get_text_input(f"Config URL is currently: {current_value}", None, None) if new_value is not None: current_value = new_value overwrite = get_list_input(f"Are you sure you want to load this config?", None, ["Yes", "No"]) @@ -396,7 +406,7 @@ def settings_menu(stdscr: object, interface: object) -> None: if selected_option in ["longName", "shortName", "isLicensed"]: if selected_option in ["longName", "shortName"]: new_value = get_text_input( - f"{human_readable_name} is currently: {current_value}", selected_option + f"{human_readable_name} is currently: {current_value}", selected_option, None ) new_value = current_value if new_value is None else new_value menu_state.current_menu[selected_option] = (field, new_value) @@ -416,7 +426,9 @@ def settings_menu(stdscr: object, interface: object) -> None: menu_state.start_index.pop() elif selected_option in ["latitude", "longitude", "altitude"]: - new_value = get_text_input(f"{human_readable_name} is currently: {current_value}", selected_option) + new_value = get_text_input( + f"{human_readable_name} is currently: {current_value}", selected_option, None + ) new_value = current_value if new_value is None else new_value menu_state.current_menu[selected_option] = (field, new_value) @@ -455,17 +467,26 @@ def settings_menu(stdscr: object, interface: object) -> None: menu_state.start_index.pop() elif field.type == 13: # Field type 13 corresponds to UINT32 - new_value = get_text_input(f"{human_readable_name} is currently: {current_value}", selected_option) + input_type = get_input_type_for_field(field) + new_value = get_text_input( + f"{human_readable_name} is currently: {current_value}", selected_option, input_type + ) new_value = current_value if new_value is None else int(new_value) menu_state.start_index.pop() elif field.type == 2: # Field type 13 corresponds to INT64 - new_value = get_text_input(f"{human_readable_name} is currently: {current_value}", selected_option) + input_type = get_input_type_for_field(field) + new_value = get_text_input( + f"{human_readable_name} is currently: {current_value}", selected_option, input_type + ) new_value = current_value if new_value is None else float(new_value) menu_state.start_index.pop() else: # Handle other field types - new_value = get_text_input(f"{human_readable_name} is currently: {current_value}", selected_option) + input_type = get_input_type_for_field(field) + new_value = get_text_input( + f"{human_readable_name} is currently: {current_value}", selected_option, input_type + ) new_value = current_value if new_value is None else new_value menu_state.start_index.pop() diff --git a/contact/utilities/input_handlers.py b/contact/utilities/input_handlers.py index 6ec8c66..ddb95cf 100644 --- a/contact/utilities/input_handlers.py +++ b/contact/utilities/input_handlers.py @@ -10,7 +10,7 @@ from contact.ui.dialog import dialog from contact.utilities.validation_rules import get_validation_for -def get_text_input(prompt: str, selected_config: str) -> Optional[str]: +def get_text_input(prompt: str, selected_config: str, input_type: str) -> Optional[str]: """Handles user input with wrapped text for long prompts.""" height = 8 width = 80 @@ -44,7 +44,7 @@ def get_text_input(prompt: str, selected_config: str) -> Optional[str]: validation = get_validation_for(selected_config) max_length = validation.get("max_length") fixed_length = validation.get("fixed_length") - input_type = validation.get("type", str) + # input_type = validation.get("type", str) user_input = "" # Start user input after the prompt text diff --git a/contact/utilities/validation_rules.py b/contact/utilities/validation_rules.py index c450a6c..7230135 100644 --- a/contact/utilities/validation_rules.py +++ b/contact/utilities/validation_rules.py @@ -1,32 +1,7 @@ -class InputType: - STRING = str - INTEGER = int - FLOAT = float - - validation_rules = { - "shortName": { - "max_length": 4, - "type": InputType.STRING, - }, - "longName": { - "max_length": 32, - "type": InputType.STRING, - }, - "fixed_pin": { - "max_length": 6, - "fixed_length": 6, - "type": InputType.INTEGER, - }, - "adc_multiplier_override": { - "type": InputType.FLOAT, - }, - "button_gpio": { - "type": InputType.INTEGER, - }, - "buzzer_gpio": { - "type": InputType.INTEGER, - }, + "shortName": {"max_length": 4}, + "longName": {"max_length": 32}, + "fixed_pin": {"max_length": 6, "fixed_length": 6}, }