...
This commit is contained in:
		
							
								
								
									
										77
									
								
								_archive/openrpc/generator/client/generator.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								_archive/openrpc/generator/client/generator.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
from typing import Dict, List, Optional, Union
 | 
			
		||||
from urllib.parse import urlparse
 | 
			
		||||
 | 
			
		||||
from heroserver.openrpc.generator.code.lang_code_generator import LangCodeGenerator
 | 
			
		||||
from heroserver.openrpc.generator.model.model_generator import ModelGenerator
 | 
			
		||||
 | 
			
		||||
from heroserver.openrpc.model.common import (
 | 
			
		||||
    ContentDescriptorObject,
 | 
			
		||||
    ReferenceObject,
 | 
			
		||||
)
 | 
			
		||||
from heroserver.openrpc.model.openrpc_spec import OpenRPCSpec
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ClientGenerator:
 | 
			
		||||
    def __init__(
 | 
			
		||||
        self,
 | 
			
		||||
        spec: OpenRPCSpec,
 | 
			
		||||
        lang_code_generator: LangCodeGenerator,
 | 
			
		||||
        output_file: str,
 | 
			
		||||
    ) -> None:
 | 
			
		||||
        self.spec = spec
 | 
			
		||||
        self.model_generator = ModelGenerator(spec, lang_code_generator)
 | 
			
		||||
        self.lang_code_generator = lang_code_generator
 | 
			
		||||
        self.output_file = output_file
 | 
			
		||||
 | 
			
		||||
    def generate_client(self):
 | 
			
		||||
        code_pre = self.lang_code_generator.generate_imports()
 | 
			
		||||
        code_models = self.model_generator.generate_models()
 | 
			
		||||
        code_methods = self.generate_methods()
 | 
			
		||||
 | 
			
		||||
        # Write the generated code to a file
 | 
			
		||||
        with open(self.output_file, "w") as file:
 | 
			
		||||
            file.write(code_pre)
 | 
			
		||||
            file.write("\n")
 | 
			
		||||
            file.write(code_models)
 | 
			
		||||
            file.write("\n")
 | 
			
		||||
            file.write(code_methods)
 | 
			
		||||
 | 
			
		||||
        print(f"Generated API code has been written to {self.output_file}")
 | 
			
		||||
 | 
			
		||||
    def generate_methods(self):
 | 
			
		||||
        servers = self.spec.servers
 | 
			
		||||
        base_url = "http://localhost:8000"
 | 
			
		||||
        if servers:
 | 
			
		||||
            base_url = servers[0].url
 | 
			
		||||
 | 
			
		||||
        url = urlparse(base_url)
 | 
			
		||||
        methods = []
 | 
			
		||||
        for method_spec in self.spec.methods:
 | 
			
		||||
            params: Dict[str, str] = {}
 | 
			
		||||
            for param in method_spec.params:
 | 
			
		||||
                params[param.name] = self.model_generator.jsonschema_to_type(
 | 
			
		||||
                    ["methods", method_spec.name, "params", param.name],
 | 
			
		||||
                    param.schema,
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
            return_type = self.method_result_return_type(["methods", method_spec.name, "result"], method_spec.result)
 | 
			
		||||
            methods.append(self.lang_code_generator.generate_method(method_spec, url, params, return_type))
 | 
			
		||||
 | 
			
		||||
        return "\n\n".join(methods)
 | 
			
		||||
 | 
			
		||||
    def method_result_return_type(
 | 
			
		||||
        self,
 | 
			
		||||
        path: List[str],
 | 
			
		||||
        method_result: Optional[Union[ContentDescriptorObject, ReferenceObject]],
 | 
			
		||||
    ) -> str:
 | 
			
		||||
        if not method_result:
 | 
			
		||||
            type_name = ""
 | 
			
		||||
 | 
			
		||||
        if isinstance(method_result, ContentDescriptorObject):
 | 
			
		||||
            schema = method_result.schema
 | 
			
		||||
            type_name = self.model_generator.jsonschema_to_type(path, schema)
 | 
			
		||||
 | 
			
		||||
        elif isinstance(method_result, ReferenceObject):
 | 
			
		||||
            type_name = self.model_generator.jsonschema_to_type(path, method_result)
 | 
			
		||||
 | 
			
		||||
        return type_name
 | 
			
		||||
		Reference in New Issue
	
	Block a user