@@ -7,6 +7,10 @@ var Enum = require("./enum"),
7
7
types = require ( "./types" ) ,
8
8
util = require ( "./util" ) ;
9
9
10
+ function missing ( field ) {
11
+ return "missing required '" + field . name ;
12
+ }
13
+
10
14
/**
11
15
* Generates a decoder specific to the specified message type.
12
16
* @param {Type } mtype Message type
@@ -27,7 +31,8 @@ function decoder(mtype) {
27
31
gen
28
32
( "switch(t>>>3){" ) ;
29
33
30
- for ( var i = 0 ; i < /* initializes */ mtype . fieldsArray . length ; ++ i ) {
34
+ var i = 0 ;
35
+ for ( ; i < /* initializes */ mtype . fieldsArray . length ; ++ i ) {
31
36
var field = mtype . _fieldsArray [ i ] . resolve ( ) ,
32
37
type = field . resolvedType instanceof Enum ? "uint32" : field . type ,
33
38
ref = "m" + util . safeProp ( field . name ) ; gen
@@ -77,13 +82,23 @@ function decoder(mtype) {
77
82
( "break" ) ;
78
83
79
84
// Unknown fields
80
- } return gen
85
+ } gen
81
86
( "default:" )
82
87
( "r.skipType(t&7)" )
83
88
( "break" )
84
89
85
90
( "}" )
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
87
102
( "return m" ) ;
88
- /* eslint-enable no-unexpected-multiline */
103
+ /* eslint-enable no-unexpected-multiline, block-scoped-var */
89
104
}
0 commit comments