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}')
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")
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) + ');')