From 8d003b55681c8b8dbca36ff5dfef9cb566d3fc1f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= <gp5761@partner.kit.edu>
Date: Mon, 31 Mar 2025 15:10:03 +0200
Subject: [PATCH] WIP: Generate EnumObjects

---
 .../middleware_generator/MiddlewareLoader.py  |  8 ++-
 .../middleware_generator/MiddlewareModel.py   |  2 +-
 .../middleware_generator/generator.py         | 64 ++++++++++++-------
 3 files changed, 48 insertions(+), 26 deletions(-)

diff --git a/net_api_generator/middleware_generator/MiddlewareLoader.py b/net_api_generator/middleware_generator/MiddlewareLoader.py
index a3d0b95..3d64efc 100644
--- a/net_api_generator/middleware_generator/MiddlewareLoader.py
+++ b/net_api_generator/middleware_generator/MiddlewareLoader.py
@@ -1,6 +1,6 @@
 import json
 from graphlib import TopologicalSorter
-from typing import Optional
+from typing import Optional, List
 
 from net_api_generator.middleware_generator.MiddlewareModel import ApiObject, FunctionParameterEnumType, EnumString, \
     FunctionParameter, FunctionParameterBaseType, TypeConnector, FunctionParameterSimpleType, \
@@ -10,6 +10,7 @@ from net_api_generator.middleware_generator.MiddlewareModel import ApiObject, Fu
 class MiddlewareLoader:
     openapi_file: str
     api_objects: list[ApiObject] = []
+    dependencies: dict[str, List[str]] = {}
 
     def __init__(self, openapi_file):
         self.openapi_file = openapi_file
@@ -91,12 +92,12 @@ class MiddlewareLoader:
     def load_api_object(self, component_key, component: dict)->ApiObject:
         if 'properties' in component:
             function_paramter_types = self.load_properties_parameter_types(component['properties'])
-            function_parameters = {parameter_type.title: FunctionParameter(parameter_type.title, parameter_type) for parameter_type in function_paramter_types}
+            function_parameters = [FunctionParameter(parameter_type.title, parameter_type) for parameter_type in function_paramter_types]
             return ApiObject(component_key, function_parameters)
         elif 'enum' in component:
             enum_type = self.load_enum_parameter_type(component)
             function_parameter = FunctionParameter(enum_type.title, enum_type)
-            return ApiObject(enum_type.title, {enum_type.title: function_parameter})
+            return ApiObject(enum_type.title, [function_parameter])
         else:
             raise ValueError('Unexpected structure of Open API Component')
 
@@ -123,6 +124,7 @@ class MiddlewareLoader:
             references = find_reference_dependencies(component)
             for reference in references:
                 ts.add(component_key, reference)
+            self.dependencies[component_key] = references
         result = list(ts.static_order())
         return result
 
diff --git a/net_api_generator/middleware_generator/MiddlewareModel.py b/net_api_generator/middleware_generator/MiddlewareModel.py
index 6dcee09..7ed1141 100644
--- a/net_api_generator/middleware_generator/MiddlewareModel.py
+++ b/net_api_generator/middleware_generator/MiddlewareModel.py
@@ -64,6 +64,6 @@ class FunctionParameter:
 @dataclass()
 class ApiObject:
     name: str
-    parameters: dict[str, FunctionParameter]
+    parameters: list[FunctionParameter]
 
 
diff --git a/net_api_generator/middleware_generator/generator.py b/net_api_generator/middleware_generator/generator.py
index d9c053d..b9378bf 100644
--- a/net_api_generator/middleware_generator/generator.py
+++ b/net_api_generator/middleware_generator/generator.py
@@ -1,34 +1,54 @@
 import json
 
+
 from net_api_generator.middleware_generator.MiddlewareLoader import MiddlewareLoader as Loader
 from net_api_generator.middleware_generator.MiddlewareModel import FunctionParameterEnumType, \
-    FunctionParameterArrayType, FunctionParameterSimpleType, FunctionParameterComposedType
+    FunctionParameterArrayType, FunctionParameterSimpleType, FunctionParameterComposedType,\
+    FunctionParameter, ApiObject
 
 
 def typescript(open_api_file):
+    def generate_object_class(api_object: ApiObject):
+        api_object_code = ("export class ${API_OBJECT_NAME} {\n"
+                           "\t${API_ATTRIBUTE}\n"
+                           "\tconstructor(${CONSTRUCTOR_PARAMETER}) {\n"
+                           "\t\t${ATTRIBUTE_ASSIGNMENT}\n"
+                           "\t}"
+                           "}")
+    def generate_integer_enum(enum_parameter: FunctionParameter):
+        pass
+
+    def generate_object_enum(api_object: ApiObject, enum_parameter: FunctionParameter):
+        if isinstance(enum_parameter.data_type, FunctionParameterEnumType):
+            code_template = ("export enum ${API_OBJECT_NAME} {\n"
+                             "\t${ENUM_VALUE}\n"
+                             "}")
+            code_template = code_template.replace("${API_OBJECT_NAME}", api_object.name)
+            if enum_parameter.data_type.data_type == 'string':
+                for i, possible_value in enumerate(enum_parameter.data_type.enum):
+                    enum_value_str = f"{str(possible_value).upper()} = '{str(possible_value)}'"
+                    if i < len(enum_parameter.data_type.enum) - 1:
+                        code_template = code_template.replace("${ENUM_VALUE}", enum_value_str + ",\n\t${ENUM_VALUE}")
+                    else:
+                        code_template = code_template.replace("${ENUM_VALUE}", enum_value_str)
+                return code_template
+            else:
+                for i, possible_value in enumerate(enum_parameter.data_type.enum):
+                    enum_value_str = f"VALUE_{possible_value} = '{str(possible_value)}'"
+                    if i < len(enum_parameter.data_type.enum) - 1:
+                        code_template = code_template.replace("${ENUM_VALUE}", enum_value_str + ",\n\t${ENUM_VALUE}")
+                    else:
+                        code_template = code_template.replace("${ENUM_VALUE}", enum_value_str)
+                print(code_template)
+                return code_template
+        else:
+            raise ValueError("Passed Parameter is not an enum!")
+
+
     loader = Loader(open_api_file)
     loader.load()
 
     api_objects = loader.api_objects
     for api_object in api_objects:
-        api_object_code = ("export class ${API_OBJECT_NAME}\n"
-         "\t${API_ATTRIBUTE}\n"
-         "\tconstructor(${CONSTRUCTOR_PARAMETER}) {\n"
-         "\t\t${ATTRIBUTE_ASSIGNMENT}\n"
-         "\t}"
-         "}")
-
-        api_object_code = api_object_code.replace("${API_OBJECT_NAME}", api_object.name)
-
-        for parameter in api_object.parameters.values():
-            parameter_name = parameter.title
-            parameter_type = parameter.data_type
-            if isinstance(parameter_type, FunctionParameterEnumType):
-                print(parameter_name + " " + parameter_type.data_type)
-            elif isinstance(parameter_type, FunctionParameterArrayType):
-                print(parameter_name + " " + parameter_type.item_type.title)
-            elif isinstance(parameter_type, FunctionParameterSimpleType):
-                #todo: abstract method to resolve datatype name for referencing recursive data_type uses
-                print(parameter_name + " " + parameter_type.title)
-            elif isinstance(parameter_type, FunctionParameterComposedType):
-                print(parameter_name + " " + parameter_type.title)
+        if len(api_object.parameters) == 1 and isinstance(api_object.parameters[0].data_type, FunctionParameterEnumType):
+            generate_object_enum(api_object, api_object.parameters[0])
-- 
GitLab