@@ -7,6 +7,10 @@ var Enum = require("./enum"),
77 types = require ( "./types" ) ,
88 util = require ( "./util" ) ;
99
10+ function missing ( field ) {
11+ return "missing required '" + field . name ;
12+ }
13+
1014/**
1115 * Generates a decoder specific to the specified message type.
1216 * @param {Type } mtype Message type
@@ -27,7 +31,8 @@ function decoder(mtype) {
2731 gen
2832 ( "switch(t>>>3){" ) ;
2933
30- for ( var i = 0 ; i < /* initializes */ mtype . fieldsArray . length ; ++ i ) {
34+ var i = 0 ;
35+ for ( ; i < /* initializes */ mtype . fieldsArray . length ; ++ i ) {
3136 var field = mtype . _fieldsArray [ i ] . resolve ( ) ,
3237 type = field . resolvedType instanceof Enum ? "uint32" : field . type ,
3338 ref = "m" + util . safeProp ( field . name ) ; gen
@@ -77,13 +82,23 @@ function decoder(mtype) {
7782 ( "break" ) ;
7883
7984 // Unknown fields
80- } return gen
85+ } gen
8186 ( "default:" )
8287 ( "r.skipType(t&7)" )
8388 ( "break" )
8489
8590 ( "}" )
86- ( "}" )
91+ ( "}" ) ;
92+
93+ // Field presence
94+ for ( i = 0 ; i < mtype . _fieldsArray . length ; ++ i ) {
95+ var rfield = mtype . _fieldsArray [ i ] ;
96+ if ( rfield . required ) gen
97+ ( "if(!m.hasOwnProperty(%j))" , rfield . name )
98+ ( "throw Error(%j)" , missing ( rfield ) ) ;
99+ }
100+
101+ return gen
87102 ( "return m" ) ;
88- /* eslint-enable no-unexpected-multiline */
103+ /* eslint-enable no-unexpected-multiline, block-scoped-var */
89104}
0 commit comments