|  | {#--- Begin #} | 
|  | function {{struct.name}}(values) { | 
|  | this.initDefaults_(); | 
|  | this.initFields_(values); | 
|  | } | 
|  |  | 
|  | {#--- Enums #} | 
|  | {%- from "enum_definition.tmpl" import enum_def %} | 
|  | {%  for enum in struct.enums %} | 
|  | {{enum_def("%s.%s"|format(struct.name, enum.name), enum)}} | 
|  | {%-  endfor %} | 
|  |  | 
|  | {#--- Constants #} | 
|  | {%  for constant in struct.constants %} | 
|  | {{struct.name}}.{{constant.name}} = {{constant.value|expression_to_text}}; | 
|  | {%-  endfor %} | 
|  |  | 
|  | {#--- initDefaults() #} | 
|  | {{struct.name}}.prototype.initDefaults_ = function() { | 
|  | {%- for packed_field in struct.packed.packed_fields %} | 
|  | this.{{packed_field.field.name}} = {{packed_field.field|default_value}}; | 
|  | {%- endfor %} | 
|  | }; | 
|  |  | 
|  | {#--- initFields() #} | 
|  | {{struct.name}}.prototype.initFields_ = function(fields) { | 
|  | for(var field in fields) { | 
|  | if (this.hasOwnProperty(field)) | 
|  | this[field] = fields[field]; | 
|  | } | 
|  | }; | 
|  |  | 
|  | {#--- Validation #} | 
|  |  | 
|  | {{struct.name}}.validate = function(messageValidator, offset) { | 
|  | var err; | 
|  | {% macro check_err() -%} | 
|  | if (err !== validator.validationError.NONE) | 
|  | return err; | 
|  | {%- endmacro %} | 
|  | err = messageValidator.validateStructHeader(offset, {{struct.name}}.encodedSize, {{struct.packed.packed_fields|length}}); | 
|  | {{check_err()}} | 
|  |  | 
|  | {%- for packed_field in struct.packed.packed_fields %} | 
|  | {%-   set field_name = packed_field.field.name %} | 
|  | {%-   if packed_field.field|is_string_pointer_field %} | 
|  | // validate {{struct.name}}.{{field_name}} | 
|  | err = messageValidator.validateStringPointer({{packed_field|validate_string_params}}) | 
|  | {{check_err()}} | 
|  | {%-   elif packed_field.field|is_array_pointer_field %} | 
|  | // validate {{struct.name}}.{{field_name}} | 
|  | err = messageValidator.validateArrayPointer({{packed_field|validate_array_params}}); | 
|  | {{check_err()}} | 
|  | {%-   elif packed_field.field|is_struct_pointer_field %} | 
|  | // validate {{struct.name}}.{{field_name}} | 
|  | err = messageValidator.validateStructPointer({{packed_field|validate_struct_params}}); | 
|  | {{check_err()}} | 
|  | {%-   elif packed_field.field|is_map_pointer_field %} | 
|  | // validate {{struct.name}}.{{field_name}} | 
|  | err = messageValidator.validateMapPointer({{packed_field|validate_map_params}}); | 
|  | {{check_err()}} | 
|  | {%-   elif packed_field.field|is_handle_field %} | 
|  | // validate {{struct.name}}.{{field_name}} | 
|  | err = messageValidator.validateHandle({{packed_field|validate_handle_params}}) | 
|  | {{check_err()}} | 
|  | {%-   endif %} | 
|  | {%- endfor %} | 
|  |  | 
|  | return validator.validationError.NONE; | 
|  | }; | 
|  |  | 
|  | {#--- Encoding and decoding #} | 
|  |  | 
|  | {{struct.name}}.encodedSize = codec.kStructHeaderSize + {{struct.packed|payload_size}}; | 
|  |  | 
|  | {{struct.name}}.decode = function(decoder) { | 
|  | var packed; | 
|  | var val = new {{struct.name}}(); | 
|  | var numberOfBytes = decoder.readUint32(); | 
|  | var numberOfFields = decoder.readUint32(); | 
|  | {%- for byte in struct.bytes %} | 
|  | {%-   if byte.packed_fields|length > 1 %} | 
|  | packed = decoder.readUint8(); | 
|  | {%-     for packed_field in byte.packed_fields %} | 
|  | val.{{packed_field.field.name}} = (packed >> {{packed_field.bit}}) & 1 ? true : false; | 
|  | {%-     endfor %} | 
|  | {%-   else %} | 
|  | {%-     for packed_field in byte.packed_fields %} | 
|  | val.{{packed_field.field.name}} = decoder.{{packed_field.field.kind|decode_snippet}}; | 
|  | {%-     endfor %} | 
|  | {%-   endif %} | 
|  | {%-   if byte.is_padding %} | 
|  | decoder.skip(1); | 
|  | {%-   endif %} | 
|  | {%- endfor %} | 
|  | return val; | 
|  | }; | 
|  |  | 
|  | {{struct.name}}.encode = function(encoder, val) { | 
|  | var packed; | 
|  | encoder.writeUint32({{struct.name}}.encodedSize); | 
|  | encoder.writeUint32({{struct.packed.packed_fields|length}}); | 
|  |  | 
|  | {%- for byte in struct.bytes %} | 
|  | {%-   if byte.packed_fields|length > 1 %} | 
|  | packed = 0; | 
|  | {%-     for packed_field in byte.packed_fields %} | 
|  | packed |= (val.{{packed_field.field.name}} & 1) << {{packed_field.bit}} | 
|  | {%-     endfor %} | 
|  | encoder.writeUint8(packed); | 
|  | {%-   else %} | 
|  | {%-     for packed_field in byte.packed_fields %} | 
|  | encoder.{{packed_field.field.kind|encode_snippet}}val.{{packed_field.field.name}}); | 
|  | {%-     endfor %} | 
|  | {%-   endif %} | 
|  | {%-   if byte.is_padding %} | 
|  | encoder.skip(1); | 
|  | {%-   endif %} | 
|  | {%- endfor %} | 
|  | }; |