示例#1
0
    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}")
示例#2
0
    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}")
示例#3
0
    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}")
示例#4
0
    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) + ');')
示例#5
0
    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")
示例#6
0
    def __init__(self, uri, encoding="utf-8", mapToBE={}, mapFromBE=None):
        """Initialises a new XML repo parser. mapToBE should be a dictionary mapping the source
        XML element tags to BE element names if necessary. Current BE bug
        fields:

        bug: XMLIssue
        """
        if mapFromBE is None: mapFromBE={v:k for k, v in mapToBE.iteritems()}
        ParserBase.__init__(self, uri)
        self.__mapToBE=mapToBE
        self.__mapFromBE=mapFromBE
        self.source=None
        self.bugs={}
        # Save creating an XMLSchema per instance by poking this into the derived class as a static variable
        if self.xml_schema is None:
            self.__class__.xml_schema=etree.XMLSchema(file=self._schemapath())
示例#7
0
    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")
示例#8
0
    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}")
示例#9
0
    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) +
                    ');')
示例#10
0
    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}')
示例#11
0
 def struct_parser(self, name, shape):
     """
     guts of the XML parser for struct shapes
     """
     children = shape['members']
     self.append('\t\tlet mut obj = ' + name + '::default();')
     if children:
         self.append('\t\tloop {')
         self.append('\t\t\tlet current_name = try!(peek_at_name(stack));')
         for (cname, child) in children.iteritems():
             self.parse_struct_child(cname, child, ParserBase.is_required(shape, cname))
         self.append('\t\t\tbreak;\n\t\t}')
示例#12
0
 def struct_parser(self, name, shape):
     """
     guts of the XML parser for struct shapes
     """
     children = shape['members']
     self.append('\t\tlet mut obj = ' + name + '::default();')
     if children:
         self.append('\t\tloop {')
         self.append('\t\t\tlet current_name = try!(peek_at_name(stack));')
         for (cname, child) in children.iteritems():
             self.parse_struct_child(cname, child,
                                     ParserBase.is_required(shape, cname))
         self.append('\t\t\tbreak;\n\t\t}')
示例#13
0
    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}')