summaryrefslogtreecommitdiff
path: root/server/parse.py
diff options
context:
space:
mode:
Diffstat (limited to 'server/parse.py')
-rw-r--r--server/parse.py127
1 files changed, 127 insertions, 0 deletions
diff --git a/server/parse.py b/server/parse.py
new file mode 100644
index 0000000..93e07f6
--- /dev/null
+++ b/server/parse.py
@@ -0,0 +1,127 @@
+'''
+ A core class handling the standard input loop,
+ parsing the data & translating aliases. It
+ also takes care of directing the execution
+ of actions of the program.
+
+ Verified: 2021 February 7
+ * Follows PEP8
+ * Tested Platforms
+ * Windows 10
+ * Third Party Modules
+ * eel
+'''
+
+from server.state import ServerStatic, Dynamic
+from server.controller import Controller
+from server.settings import Settings
+from server.console import Console
+from shared.helper import Helper
+from shared.state import Static
+from server.alias import Alias
+from shared.data import Data
+import server.action
+
+import traceback
+import inspect
+
+if not ServerStatic.TERMINAL:
+ import eel
+
+
+class Parse:
+
+ @staticmethod
+ def stdin():
+ while True:
+ result = Parse.parse_string(Parse.parse_alias(input()))
+ message, lower = Data.lower(result)
+
+ if Dynamic.SESSION:
+ if lower in ServerStatic.UNIVERSAL \
+ or lower in ServerStatic.SESSION:
+ Parse.execute(lower, result, False)
+ else:
+ if Settings.AUTO_SHELL:
+ Controller.message(False, result)
+ else:
+ Parse.__default_message(lower, message)
+ elif lower in ServerStatic.UNIVERSAL:
+ Parse.execute(lower, result, False)
+ else:
+ Parse.__default_message(lower, message)
+
+ @staticmethod
+ def parse_string(message):
+ arguments = message.split(ServerStatic.ARG_SEPARATOR)
+ arguments_dict = Data.message(arguments[0].strip())
+
+ for argument in arguments[1:]:
+ key_value_list = [el for el in argument.split() if el]
+ key_value_list_len = len(key_value_list)
+
+ if key_value_list_len == 0:
+ break
+
+ key, value = key_value_list[0], key_value_list[1:]
+
+ if key_value_list_len == 1:
+ arguments_dict[key] = True
+ else:
+ arguments_dict[key] = ' '.join(value)
+
+ return arguments_dict
+
+ @staticmethod
+ def parse_alias(message):
+ alias = Alias(True).alias_exists(message, True)
+
+ if alias:
+ return alias
+ else:
+ return message
+
+ @staticmethod
+ def execute(lower, request, gui_call, custom=None):
+ try:
+ if gui_call:
+ lower = Data.lower(request, False)
+
+ assert ((lower in ServerStatic.SESSION and Dynamic.SESSION)
+ or lower in ServerStatic.UNIVERSAL), \
+ 'No Active Session / Request Type Not Found'
+
+ method = getattr(server.action, lower)
+ params = len(inspect.signature(method).parameters)
+
+ if params == 0:
+ return method()
+ if params == 1:
+ return method(request)
+ if params == 2:
+ return method(request, gui_call)
+ else:
+ return method(request, gui_call, custom)
+ except SystemExit:
+ raise
+ except Exception:
+ Console.log('Request Execution Failed\n',
+ Static.DANGER, ServerStatic.ACTION)
+ Console.log(traceback.format_exc(),
+ log_type=ServerStatic.TRACEBACK)
+
+ @staticmethod
+ def __default_message(lower, message):
+ if lower:
+ Console.printf(Helper.join(
+ f'"{message}" request type could not be found',
+ 'Use "help" request type for assistance'
+ ), Static.WARNING)
+ else:
+ Console.printf(raw=True)
+
+ if not ServerStatic.TERMINAL:
+ @staticmethod
+ @eel.expose
+ def execute_eel(request):
+ return Parse.execute(None, request, True)