changeset 114:346677d7293b

Format generated rust code and add global parameters to all resources
author Lewin Bormann <lbo@spheniscida.de>
date Sun, 25 Oct 2020 13:10:08 +0100
parents fdf0330d1cc4
children 724c8fbd071c
files generate/generate.py
diffstat 1 files changed, 16 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/generate/generate.py	Sun Oct 25 09:13:44 2020 +0100
+++ b/generate/generate.py	Sun Oct 25 13:10:08 2020 +0100
@@ -12,6 +12,7 @@
 
 import os
 from os import path
+import subprocess
 
 from templates import *
 
@@ -227,7 +228,7 @@
             struct['optional_fields'] = opt_query_parameters
             frags.append(chevron.render(SchemaDisplayTmpl, struct))
         # Generate parameter types for subresources.
-        frags.extend(generate_params_structs(resource.get('resources', {}), super_name=resourcename))
+        frags.extend(generate_params_structs(resource.get('resources', {}), super_name=resourcename, global_params=global_params))
     return frags
 
 
@@ -243,7 +244,7 @@
     return 'format!("{}", {})'.format(string, format_params), snakeparams
 
 
-def generate_service(resource, methods, discdoc):
+def generate_service(resource, methods, discdoc, generate_subresources=True):
     """Generate the code for all methods in a resource.
 
     Returns a rendered string with source code.
@@ -255,8 +256,9 @@
     subresource_fragments = []
 
     # Generate methods for subresources.
-    for subresname, subresource in methods.get('resources', {}).items():
-        subresource_fragments.append(generate_service(service + capitalize_first(subresname), subresource, discdoc))
+    if generate_subresources:
+        for subresname, subresource in methods.get('resources', {}).items():
+            subresource_fragments.append(generate_service(service + capitalize_first(subresname), subresource, discdoc))
 
     for methodname, method in methods.get('methods', {}).items():
         # Goal: Instantiate the templates for upload and non-upload methods.
@@ -439,7 +441,7 @@
     for resource, methods in resources.items():
         services.append(generate_service(resource, methods, discdoc))
     if 'methods' in discdoc:
-        services.append(generate_service('Global', discdoc, discdoc))
+        services.append(generate_service('Global', discdoc, discdoc, generate_subresources=False))
 
     # Generate schema types.
     structs = []
@@ -459,7 +461,8 @@
 
     # Assemble everything into a file.
     modname = (discdoc['id'] + '_types').replace(':', '_')
-    with open(path.join('gen', modname + '.rs'), 'w') as f:
+    out_path = path.join('gen', modname + '.rs')
+    with open(out_path, 'w') as f:
         f.write(RustHeader)
         f.write(scopes_type)
         # Render resource structs.
@@ -476,6 +479,10 @@
         # Render service impls.
         for s in services:
             f.write(s)
+    try:
+        subprocess.run(['rustfmt', out_path, '--edition=2018'])
+    except:
+        return
 
 
 def from_cache(apiId):
@@ -554,6 +561,9 @@
         if 'error' in discdoc:
             print('Error while fetching document for', doc['id'], ':', discdoc)
             return
+        if 'methods' in discdoc:
+            #raise NotImplementedError("top-level methods are not yet implemented properly. Please take care.")
+            pass
         generate_all(discdoc)
         return