def request_method(self, operation): http = operation['http'] output_type = ParserBase.get_output_type(operation) self.generate_documentation(operation, "\t") # This feels so hacky to get around scoping of these in the else block: input_name = '' input_type = '' if not ('input' in operation): self.append("\tpub fn " + ParserBase.c_to_s(operation['name']) + "(&mut self" ") -> Result<" + output_type + ", AWSError> {") else: input_name = operation['input']['shape'] input_type = self.shape(input_name) self.append("\tpub fn " + ParserBase.c_to_s(operation['name']) + "(&mut self, input: &" + input_name + ") -> Result<" + output_type + ", AWSError> {") self.append('\t\tlet mut request = SignedRequest::new("' + http['method'] + '", "' + self.metadata('endpointPrefix') + '", &self.region, "' + http['requestUri'] + '");') self.append("\t\tlet mut params = Params::new();") self.append('\t\tparams.put("Action", "' + operation['name'] + '");') if ('input' in operation): self.append('\t\t' + input_name + 'Writer::write_params(&mut params, \"\", &input);') self.append('\t\trequest.set_params(params);') self.append( '\t\tlet mut result = request.sign_and_execute(try!(self.creds.get_credentials()));' ) self.append('\t\tlet status = result.status.to_u16();') # self.append('\t\tprintln!("{}", output);' self.append('\t\tlet mut reader = EventReader::new(result);') self.append( '\t\tlet mut stack = XmlResponseFromAws::new(reader.events().peekable());' ) self.append('\t\tstack.next(); // xml start tag') self.append('\t\tstack.next();') self.append('\t\tmatch status {') self.append('\t\t\t200 => { ') if output_type == '()': self.append('\t\t\t\tOk(())') else: self.append('\t\t\t\tOk(try!(' + output_type + 'Parser::parse_xml("' + output_type + '", &mut stack)))') self.append('\t\t\t}') self.append('\t\t\t_ => { Err(AWSError::new("error")) }') self.append('\t\t}') self.append("\t}")
def request_method(self, operation): http = operation['http'] output_type = ParserBase.get_output_type(operation) self.generate_documentation(operation, "\t") if not ('input' in operation): input_name = '' input_type = '' self.append("\tpub fn " + ParserBase.c_to_s(operation['name']) + "(&mut self" ") -> Result<" + output_type + "> {") else: input_name = operation['input']['shape'] input_type = self.shape(input_name) self.append("\tpub fn " + ParserBase.c_to_s(operation['name']) + "(&mut self, input: &" + input_name + ") -> Result<" + output_type + "> {") self.append( '\t\tlet encoded = to_string(&input).expect("failed to convert input to JSON");' ) self.append('\t\tlet mut request = SignedRequest::new("' + http['method'] + '", "' + self.metadata('endpointPrefix') + '", &self.region, "' + http['requestUri'] + '");') self.append( '\t\trequest.set_content_type("application/x-amz-json-1.1".to_string());' ) self.append('\t\trequest.add_header("x-amz-target", "' + self.metadata('targetPrefix') + '.' + operation['name'] + '");') self.append('\t\trequest.set_payload(Some(encoded.as_bytes()));') self.append( '\t\tlet mut result = request.sign_and_execute(try!(self.creds.get_credentials()));' ) self.append('\t\tlet status = result.status.to_u16();') self.append('\t\tlet mut body = String::new();') self.append('\t\tresult.read_to_string(&mut body).unwrap();') self.append('\t\tmatch status {') self.append('\t\t\t200 => { ') if output_type == '()': self.append('\t\t\t\tOk(())') else: self.append( '\t\t\t\tlet decoded: ' + output_type + ' = from_str(&body).expect("failed to convert JSON into Rust type");' ) self.append('\t\t\t\tOk(decoded)') self.append('\t\t\t}') self.append('\t\t\t_ => {') self.append('\t\t\t\tErr(parse_error(&body))') self.append('\t\t\t}') self.append('\t\t}') self.append("\t}")
def request_method(self, operation): http = operation['http'] output_type = ParserBase.get_output_type(operation) self.generate_documentation(operation, "\t") # This feels so hacky to get around scoping of these in the else block: input_name = '' input_type = '' if not ('input' in operation): self.append("\tpub fn " + ParserBase.c_to_s( operation['name']) + "(&mut self"") -> Result<" + output_type + ", AWSError> {") else: input_name = operation['input']['shape'] input_type = self.shape(input_name) self.append("\tpub fn " + ParserBase.c_to_s(operation[ 'name']) + "(&mut self, input: &" + input_name + ") -> Result<" + output_type + ", AWSError> {") self.append( '\t\tlet mut request = SignedRequest::new("' + http['method'] + '", "' + self.metadata('endpointPrefix') + '", &self.region, "' + http['requestUri'] + '");') self.append("\t\tlet mut params = Params::new();") self.append('\t\tparams.put("Action", "' + operation['name'] + '");') if ('input' in operation): self.append('\t\t' + input_name + 'Writer::write_params(&mut params, \"\", &input);') self.append('\t\trequest.set_params(params);') self.append('\t\tlet mut result = request.sign_and_execute(try!(self.creds.get_credentials()));') self.append('\t\tlet status = result.status.to_u16();') # self.append('\t\tprintln!("{}", output);' self.append('\t\tlet mut reader = EventReader::new(result);') self.append('\t\tlet mut stack = XmlResponseFromAws::new(reader.events().peekable());') self.append('\t\tstack.next(); // xml start tag') self.append('\t\tstack.next();') self.append('\t\tmatch status {') self.append('\t\t\t200 => { ') if output_type == '()': self.append('\t\t\t\tOk(())') else: self.append('\t\t\t\tOk(try!(' + output_type + 'Parser::parse_xml("' + output_type + '", &mut stack)))') self.append('\t\t\t}') self.append('\t\t\t_ => { Err(AWSError::new("error")) }') self.append('\t\t}') self.append("\t}")
def request_method(self, operation): http = operation['http'] output_type = ParserBase.get_output_type(operation) self.generate_documentation(operation, "\t") if not ('input' in operation): input_name = '' input_type = '' self.append( "\tpub fn " + ParserBase.c_to_s(operation['name']) + "(&mut self"") -> Result<" + output_type + "> {") else: input_name = operation['input']['shape'] input_type = self.shape(input_name) self.append("\tpub fn " + ParserBase.c_to_s( operation['name']) + "(&mut self, input: &" + input_name + ") -> Result<" + output_type + "> {") self.append('\t\tlet encoded = to_string(&input).expect("failed to convert input to JSON");') self.append('\t\tlet mut request = SignedRequest::new("' + http['method'] + '", "' + self.metadata( 'endpointPrefix') + '", &self.region, "' + http['requestUri'] + '");') self.append('\t\trequest.set_content_type("application/x-amz-json-1.1".to_string());') self.append('\t\trequest.add_header("x-amz-target", "' + self.metadata('targetPrefix') + '.' + operation[ 'name'] + '");') self.append('\t\trequest.set_payload(Some(encoded.as_bytes()));') self.append('\t\tlet mut result = request.sign_and_execute(try!(self.creds.get_credentials()));') self.append('\t\tlet status = result.status.to_u16();') self.append('\t\tlet mut body = String::new();') self.append('\t\tresult.read_to_string(&mut body).unwrap();') self.append('\t\tmatch status {') self.append('\t\t\t200 => { ') if output_type == '()': self.append('\t\t\t\tOk(())') else: self.append( '\t\t\t\tlet decoded: ' + output_type + ' = from_str(&body).expect("failed to convert JSON into Rust type");') self.append('\t\t\t\tOk(decoded)') self.append('\t\t\t}') self.append('\t\t\t_ => {') self.append('\t\t\t\tErr(parse_error(&body))') self.append('\t\t\t}') self.append('\t\t}') self.append("\t}")
def struct_writer(self, shape): self.append('\t\tlet mut prefix = name.to_string();') self.append('\t\tif prefix != "" { prefix.push_str("."); }') for (name, member) in shape['members'].iteritems(): location_name = self.get_location_name(name, member) if not ParserBase.is_required(shape, name): self.append("\t\tif let Some(ref obj) = obj." + ParserBase.c_to_s(name) + " {") self.append( '\t\t\t' + member['shape'] + 'Writer::write_params(params, &(prefix.to_string() + "' + location_name + '"), obj);') self.append("\t\t}") else: self.append( '\t\t' + member['shape'] + 'Writer::write_params(params, &(prefix.to_string() + "' + location_name + '"), &obj.' + ParserBase.c_to_s(name) + ');')
def parse_struct_child(self, name, child, required): tag_name = self.get_location_name(name, child) parse_stmt = 'try!(' + child['shape'] + 'Parser::parse_xml("' + tag_name + '", stack))' if not required: parse_stmt = "Some(" + parse_stmt + ")" self.append('\t\t\tif current_name == "' + tag_name + '" {') self.append('\t\t\t\tobj.' + ParserBase.c_to_s(name) + ' = ' + parse_stmt + ';') self.append('\t\t\t\tcontinue;') self.append('\t\t\t}')
def parse_struct_child(self, name, child, required): tag_name = self.get_location_name(name, child) parse_stmt = 'try!(' + child[ 'shape'] + 'Parser::parse_xml("' + tag_name + '", stack))' if not required: parse_stmt = "Some(" + parse_stmt + ")" self.append('\t\t\tif current_name == "' + tag_name + '" {') self.append('\t\t\t\tobj.' + ParserBase.c_to_s(name) + ' = ' + parse_stmt + ';') self.append('\t\t\t\tcontinue;') self.append('\t\t\t}')
def struct_writer(self, shape): self.append('\t\tlet mut prefix = name.to_string();') self.append('\t\tif prefix != "" { prefix.push_str("."); }') for (name, member) in shape['members'].iteritems(): location_name = self.get_location_name(name, member) if not ParserBase.is_required(shape, name): self.append("\t\tif let Some(ref obj) = obj." + ParserBase.c_to_s(name) + " {") self.append('\t\t\t' + member[ 'shape'] + 'Writer::write_params(params, &(prefix.to_string() + "' + location_name + '"), obj);') self.append("\t\t}") else: self.append('\t\t' + member[ 'shape'] + 'Writer::write_params(params, &(prefix.to_string() + "' + location_name + '"), &obj.' + ParserBase.c_to_s( name) + ');')
def rust_struct(self, name, shape): self.append("#[derive(Debug, Default)]") if shape['members']: # print "MEMBERS:" + name self.append("pub struct " + name + " {") for (mname, member) in shape['members'].iteritems(): if 'documentation' in member: self.generate_documentation(member, "\t") rust_type = member['shape'] if not ParserBase.is_required(shape, mname): rust_type = "Option<" + rust_type + ">" self.append("\tpub " + ParserBase.c_to_s(mname) + ": " + rust_type + ",") self.append("}\n") else: self.append("pub struct " + name + ";\n")