changeset 13:5694ea390f8e

Also support 'any' type
author Lewin Bormann <lbo@spheniscida.de>
date Sat, 17 Oct 2020 17:37:19 +0200
parents 2a5c8f471c11
children ca993cdce94d
files generate/generate.py generate/templates.py
diffstat 2 files changed, 24 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/generate/generate.py	Sat Oct 17 17:24:06 2020 +0200
+++ b/generate/generate.py	Sat Oct 17 17:37:19 2020 +0200
@@ -124,6 +124,8 @@
                 return (optionalize('i32', optional), prop.get('description', '')), structs
             if prop['format'] == 'int64':
                 return (optionalize('i64', optional), prop.get('description', '')), structs
+        if prop['type'] == 'any':
+            return (optionalize('String', optional), 'ANY data: ' + prop.get('description', '')), structs
         raise Exception('unimplemented!', name, prop)
     except KeyError as e:
         print(name, prop)
@@ -143,11 +145,14 @@
 
 
 def generate_parameter_types(resources):
-    """Generate parameter structs from the resources list."""
+    """Generate parameter structs from the resources list.
+
+    Returns a list of source code strings.
+    """
     structs = []
     for resourcename, resource in resources.items():
         for methodname, method in resource['methods'].items():
-            print(resourcename, methodname)
+            print("processed:", resourcename, methodname)
             struct = {'name': capitalize_first(resourcename) + capitalize_first(methodname) + 'Params', 'fields': []}
             if 'parameters' in method:
                 for paramname, param in method['parameters'].items():
@@ -162,7 +167,7 @@
                         '#[serde(rename = "{}")]'.format(paramname),
                     })
             structs.append(struct)
-    return structs
+    return [chevron.render(ResourceStructTmpl, s) for s in structs]
 
 
 def resolve_parameters(string, paramsname='params', suffix=''):
@@ -176,7 +181,10 @@
 
 
 def generate_service(resource, methods, discdoc):
-    """Generate the code for all methods in a resource."""
+    """Generate the code for all methods in a resource.
+
+    Returns a rendered string with source code.
+    """
     service = capitalize_first(resource)
 
     parts = []
@@ -242,16 +250,16 @@
     resources = discdoc['resources']
     structs = []
     services = []
+    # Generate parameter types.
+    parameter_types = generate_parameter_types(resources)
+
+    for resource, methods in resources.items():
+        services.append(generate_service(resource, methods, discdoc))
+
     for name, desc in schemas.items():
         typ, substructs = type_of_property(name, desc)
         structs.extend(substructs)
 
-    # Generate parameter types.
-    structs.extend(generate_parameter_types(resources))
-
-    for resource, methods in resources.items():
-        services.append(generate_service(resource, methods, discdoc))
-
     modname = (discdoc['id'] + '_types').replace(':', '_')
     with open(path.join('gen', modname + '.rs'), 'w') as f:
         f.write(RustHeader)
@@ -260,6 +268,8 @@
                 if field.get('comment', None):
                     field['comment'] = field['comment'].replace('\n', ' ')
             f.write(chevron.render(ResourceStructTmpl, s))
+        for pt in parameter_types:
+            f.write(pt)
         for s in services:
             f.write(s)
 
@@ -286,11 +296,9 @@
                    help='Base Discovery document.')
     p.add_argument('--only_apis', default='drive:v3', help='Only process APIs with these IDs (comma-separated)')
     args = p.parse_args()
-    print(args.only_apis)
     docs = fetch_discovery_base(args.discovery_base, args.only_apis)
     for doc in docs:
         discdoc = fetch_discovery_doc(doc)
-        #print(json.dumps(discdoc, sort_keys=True, indent=2))
         generate_structs(discdoc)
 
 
--- a/generate/templates.py	Sat Oct 17 17:24:06 2020 +0200
+++ b/generate/templates.py	Sat Oct 17 17:37:19 2020 +0200
@@ -61,9 +61,9 @@
     self.scopes = scopes.as_ref().into_iter().map(|s| s.as_ref().to_string()).collect();
   }
 
-{{#methods}}
+  {{#methods}}
   {{{text}}}
-{{/methods}}
+  {{/methods}}
 
 }
 '''
@@ -80,7 +80,6 @@
     let path = "{{{base_path}}}".to_string() + &rel_path;
     let tok = self.authenticator.token(&self.scopes).await?;
     let mut url_params = format!("?oauth_token={token}&fields=*", token=tok.as_str());
-
     {{#params}}
     if let Some(ref val) = &params.{{{snake_param}}} {
         url_params.push_str(&format!("&{{{param}}}={}", val));
@@ -106,7 +105,7 @@
     let bodystr = String::from_utf8(resp_body.to_vec())?;
     let decoded = serde_json::from_str(&bodystr)?;
     Ok(decoded)
-}
+  }
 '''
 
 # Takes:
@@ -142,5 +141,5 @@
     let bodystr = String::from_utf8(resp_body.to_vec())?;
     let decoded = serde_json::from_str(&bodystr)?;
     Ok(decoded)
-}
+  }
 '''