Mercurial > lbo > hg > async-google-apis
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) = ¶ms.{{{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) -} + } '''