Skip to content

Commit 44a8d3a

Browse files
committed
Breaking: Decoder now throws if required fields are missing, see #695 / #696
1 parent 0fcde32 commit 44a8d3a

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

src/decoder.js

+19-4
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)