diff --git a/main.py b/main.py index 2cd463c..3fa862b 100644 --- a/main.py +++ b/main.py @@ -8,7 +8,9 @@ def main(): expression: str = 'IF("text" - "t" == "ex", "Correct", "Incorrect")' variables: dict[str, any] = {} string_embedded: bool = False - result: dict[str, any] = oqs_engine(expression=expression, variables=variables, string_embedded=string_embedded) + result: dict[str, any] = oqs_engine( + expression=expression, variables=variables, string_embedded=string_embedded, report_usage=True + ) print(json.dumps(result, indent=4)) diff --git a/python_oqs_implementation/oqs/engine.py b/python_oqs_implementation/oqs/engine.py index 5b12fc2..86f2ea2 100644 --- a/python_oqs_implementation/oqs/engine.py +++ b/python_oqs_implementation/oqs/engine.py @@ -1,17 +1,29 @@ import re +import time from .interpreter import OQSInterpreter from .errors import OQSBaseError from .utils.shortcuts import get_oqs_type -def oqs_engine( - expression: str, variables: dict[str, any] | None = None, string_embedded: bool = False +class ExpressionInput: + def __init__(self, expression: str, variables: dict[str, any] | None = None, string_embedded: bool = False) -> None: + self.expression: str = expression + self.variables: dict[str, any] = variables + self.string_embedded: bool = string_embedded + + +def evaluate_expression( + expression: str | ExpressionInput, variables: dict[str, any] | None = None, string_embedded: bool = False ) -> dict[str, any]: + if isinstance(expression, ExpressionInput): + variables: dict[str, any] | None = expression.variables + string_embedded: bool = expression.string_embedded + expression: str = expression.expression try: if string_embedded: def replace_embedded(match: re.match): embedded_expr: str = match.group(1) - embedded_result: dict[str, any] = oqs_engine( + embedded_result: dict[str, any] = evaluate_expression( expression=embedded_expr, variables=variables, string_embedded=False ) return str(embedded_result["results"]["value"]) @@ -31,3 +43,28 @@ def replace_embedded(match: re.match): }, "additional_info": {"type": type(e).__name__, "message": str(e)} } + + +def oqs_engine( + expression: str = None, + variables: dict[str, any] | None = None, + string_embedded: bool = False, + report_usage: bool = False, + evaluate_multiple: bool = False, + expression_inputs: list[ExpressionInput] = None +) -> dict[str, any]: + start_cpu_time: int = time.process_time_ns() + if evaluate_multiple: + if expression_inputs is None: + expression_inputs: list[ExpressionInput] = [] + expression_results: list[dict[str, any]] = [] + for expression_input in expression_inputs: + expression_results.append(evaluate_expression(expression=expression_input)) + results: dict[str, any] = {"results": expression_results} + else: + results: dict[str, any] = evaluate_expression( + expression=expression, variables=variables, string_embedded=string_embedded + ) + if report_usage: + results["cpu_time_ns"] = time.process_time_ns() - start_cpu_time + return results