diff options
| author | grothedev <grothedev@gmail.com> | 2026-04-29 01:00:18 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-29 01:00:18 -0400 |
| commit | fe210355a480b2386a05ba385aa5a265c4f7c966 (patch) | |
| tree | ed10fcc4dd1153d983164bff9523f594b4d63ff8 /templates/repl-template.py | |
| parent | e757d3020571cb139d9480f97e1b0fa86222660e (diff) | |
| parent | 00a8a558aa2984401728c5027cf054b9d7a97b6f (diff) | |
Merge pull request #1 from grothedev/copilot/clean-up-and-organize-repomaster
Clean up top-level repo layout and document the script inventory
Diffstat (limited to 'templates/repl-template.py')
| -rw-r--r-- | templates/repl-template.py | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/templates/repl-template.py b/templates/repl-template.py new file mode 100644 index 0000000..715eaf8 --- /dev/null +++ b/templates/repl-template.py @@ -0,0 +1,100 @@ +#!/bin/python3 + +import readline + +import sys + +class SimpleREPL: + def __init__(self): + self.prompt = ">> " + self.commands = { + "help": self._show_help, + "exit": self._exit_repl, + "quit": self._exit_repl, # Alias for exit + "echo": self._echo, + # Add more commands here + # "my_command": self._handle_my_command, + } + # Application-specific state can be initialized here + # self.app_state = {} + + def _show_help(self, *args): + """Displays available commands.""" + print("Available commands:") + for cmd, func in self.commands.items(): + docstring = func.__doc__ or "No description available." + print(f" {cmd:<15} - {docstring.strip().splitlines()[0]}") # Show first line of docstring + return None # No printable result for help + + def _exit_repl(self, *args): + """Exits the REPL.""" + print("Exiting REPL. Goodbye!") + sys.exit(0) + + def _echo(self, *args): + """Echoes the input arguments back to the user. + Usage: echo <arg1> <arg2> ... + """ + if not args: + return "Echo: Nothing to echo!" + return "Echo: " + " ".join(args) + + # --- Placeholder for your custom commands --- + # def _handle_my_command(self, arg1, arg2=None, *other_args): + # """ + # Description of my_command. + # Usage: my_command <required_arg> [optional_arg] ... + # """ + # # Your command logic here + # # Example: + # # self.app_state['something'] = arg1 + # # return f"Processed {arg1} and {arg2}" + # pass + + + def evaluate(self, line): + """Evaluates a single line of input.""" + parts = line.strip().split() + if not parts: + return None # Empty line + + command_name = parts[0].lower() # Case-insensitive command matching + args = parts[1:] + + if command_name in self.commands: + command_func = self.commands[command_name] + try: + return command_func(*args) + except TypeError as e: + # Catch errors related to incorrect number of arguments + return f"Error: Invalid arguments for '{command_name}'. Usage: {command_func.__doc__ or ''}" + except Exception as e: + return f"Error executing '{command_name}': {e}" + else: #todo check for partial str match + + return f"Unknown command: '{command_name}'. Type 'help' for available commands." + + def run(self): + """Runs the REPL main loop.""" + print("Welcome to SimpleREPL! Type 'help' for commands or 'exit' to quit.") + while True: + try: + line = input(self.prompt) + if line.strip(): # Process only if line is not empty + result = self.evaluate(line) + if result is not None: # Print only if there's a result + print(result) + except EOFError: # Ctrl+D + print("\nExiting REPL (EOF).") + break + except KeyboardInterrupt: # Ctrl+C + print("\nInterrupted. Type 'exit' or 'quit' to exit.") + # Optionally, you might want to clear any partial input here + # or reset some state if an operation was interrupted. + except Exception as e: + print(f"An unexpected error occurred: {e}") + # Depending on severity, you might want to break or continue + +if __name__ == "__main__": + repl_app = SimpleREPL() + repl_app.run() |
