Example #1
0
        /// <summary>
        /// The interactive mode gives you a shell-like environment in which
        /// you can code in Aquila.
        /// </summary>
        public static void interactiveMode(List <string> exec_lines = null, bool greeting = true, bool rescue_mode = false)
        {
            Global.setSetting("fail on context assertions", false); // disable context checks
            bool          new_line      = true;
            List <string> current_lines = new List <string>();

            // exec mode
            bool exec_mode = exec_lines != null;

            if (greeting)
            {
                if (rescue_mode)
                {
                    System.Console.WriteLine("interactive mode greeting");
                }
                Global.stdoutWriteLine(" [ - Aquila Interactive Interpreter - ]");
                Global.stdoutWriteLine(" [?] Type \"help\" to get a list of all the interactive-mode-only commands");
                Global.stdoutWriteLine(" [?] See https://github.com/Nicolas-Reyland/Aquila/blob/main/Aquila_Documentation.pdf for some unfinished documentation about Aquila itself");
                if (exec_mode)
                {
                    Global.stdoutWriteLine(" [!] Exec mode enabled. There are executables lines saved. Use the \"exec\" command to run them");
                }
            }

            Context.setStatus(Context.StatusEnum.instruction_main_loop);
            Context.setInfo("Interactive Mode");

            while (true)
            {
                if (new_line)
                {
                    Global.stdoutWrite(getInteractivePrefix() + " > ");
                }
                else
                {
                    Global.stdoutWrite(getInteractivePrefix() + " - ");
                }
                if (rescue_mode)
                {
                    System.Console.WriteLine("asking for input...");
                }
                string input = Global.stdinReadLine();
                if (rescue_mode)
                {
                    System.Console.WriteLine("got input: " + input);
                    Global.stdoutWriteLine(input);
                }
                if (StringUtils.normalizeWhiteSpaces(input) == "")
                {
                    continue;
                }
                if (StringUtils.normalizeWhiteSpaces(input) == "")
                {
                    continue;
                }
                input = StringUtils.removeComments(input);
                input = StringUtils.normalizeWhiteSpaces(input);

                if (input == "exit")
                {
                    Global.stdoutWriteLine("Exiting.");
                    return;
                }

                if (!processInterpreterInput(input))
                {
                    continue;                                  // command should not be executed, then continue
                }
                if (input == "exec_info")
                {
                    if (!exec_mode)
                    {
                        Global.stdoutWriteLine(" [X] Exec mode disabled. You have to have pre-defined executable lines to enable this mode");
                    }
                    else
                    {
                        Global.stdoutWriteLine(" Executable lines:");
                        foreach (string line in exec_lines)
                        {
                            Global.stdoutWriteLine("  " + line);
                        }
                    }
                    continue;
                }

                if (input == "exec")
                {
                    if (!exec_mode)
                    {
                        Global.stdoutWriteLine(" [X] Exec mode disabled. You have to have pre-defined executable lines to enable this mode");
                        continue;
                    }
                    executeLines(exec_lines, false);
                }
                else
                {
                    current_lines.Add(input);
                    if (executableLines(current_lines))
                    {
                        executeLines(current_lines);
                        new_line = true;
                    }
                    else
                    {
                        new_line = false;
                    }
                }
            }
        }