2 module.exports = verifier;
4 var Enum = require("./enum"),
5 util = require("./util");
7 function invalid(field, expected) {
8 return field.name + ": " + expected + (field.repeated && expected !== "array" ? "[]" : field.map && expected !== "object" ? "{k:"+field.keyType+"}" : "") + " expected";
12 * Generates a partial value verifier.
13 * @param {Codegen} gen Codegen instance
14 * @param {Field} field Reflected field
15 * @param {number} fieldIndex Field index
16 * @param {string} ref Variable reference
17 * @returns {Codegen} Codegen instance
20 function genVerifyValue(gen, field, fieldIndex, ref) {
21 /* eslint-disable no-unexpected-multiline */
22 if (field.resolvedType) {
23 if (field.resolvedType instanceof Enum) { gen
26 ("return%j", invalid(field, "enum value"));
27 for (var keys = Object.keys(field.resolvedType.values), j = 0; j < keys.length; ++j) gen
28 ("case %i:", field.resolvedType.values[keys[j]]);
35 ("var e=types[%i].verify(%s);", fieldIndex, ref)
37 ("return%j+e", field.name + ".")
47 ("if(!util.isInteger(%s))", ref)
48 ("return%j", invalid(field, "integer"));
55 ("if(!util.isInteger(%s)&&!(%s&&util.isInteger(%s.low)&&util.isInteger(%s.high)))", ref, ref, ref, ref)
56 ("return%j", invalid(field, "integer|Long"));
60 ("if(typeof %s!==\"number\")", ref)
61 ("return%j", invalid(field, "number"));
64 ("if(typeof %s!==\"boolean\")", ref)
65 ("return%j", invalid(field, "boolean"));
68 ("if(!util.isString(%s))", ref)
69 ("return%j", invalid(field, "string"));
72 ("if(!(%s&&typeof %s.length===\"number\"||util.isString(%s)))", ref, ref, ref)
73 ("return%j", invalid(field, "buffer"));
78 /* eslint-enable no-unexpected-multiline */
82 * Generates a partial key verifier.
83 * @param {Codegen} gen Codegen instance
84 * @param {Field} field Reflected field
85 * @param {string} ref Variable reference
86 * @returns {Codegen} Codegen instance
89 function genVerifyKey(gen, field, ref) {
90 /* eslint-disable no-unexpected-multiline */
91 switch (field.keyType) {
97 ("if(!util.key32Re.test(%s))", ref)
98 ("return%j", invalid(field, "integer key"));
105 ("if(!util.key64Re.test(%s))", ref) // see comment above: x is ok, d is not
106 ("return%j", invalid(field, "integer|Long key"));
109 ("if(!util.key2Re.test(%s))", ref)
110 ("return%j", invalid(field, "boolean key"));
114 /* eslint-enable no-unexpected-multiline */
118 * Generates a verifier specific to the specified message type.
119 * @param {Type} mtype Message type
120 * @returns {Codegen} Codegen instance
122 function verifier(mtype) {
123 /* eslint-disable no-unexpected-multiline */
125 var gen = util.codegen(["m"], mtype.name + "$verify")
126 ("if(typeof m!==\"object\"||m===null)")
127 ("return%j", "object expected");
128 var oneofs = mtype.oneofsArray,
130 if (oneofs.length) gen
133 for (var i = 0; i < /* initializes */ mtype.fieldsArray.length; ++i) {
134 var field = mtype._fieldsArray[i].resolve(),
135 ref = "m" + util.safeProp(field.name);
137 if (field.optional) gen
138 ("if(%s!=null&&m.hasOwnProperty(%j)){", ref, field.name); // !== undefined && !== null
142 ("if(!util.isObject(%s))", ref)
143 ("return%j", invalid(field, "object"))
144 ("var k=Object.keys(%s)", ref)
145 ("for(var i=0;i<k.length;++i){");
146 genVerifyKey(gen, field, "k[i]");
147 genVerifyValue(gen, field, i, ref + "[k[i]]")
151 } else if (field.repeated) { gen
152 ("if(!Array.isArray(%s))", ref)
153 ("return%j", invalid(field, "array"))
154 ("for(var i=0;i<%s.length;++i){", ref);
155 genVerifyValue(gen, field, i, ref + "[i]")
158 // required or present fields
161 var oneofProp = util.safeProp(field.partOf.name);
162 if (seenFirstField[field.partOf.name] === 1) gen
163 ("if(p%s===1)", oneofProp)
164 ("return%j", field.partOf.name + ": multiple values");
165 seenFirstField[field.partOf.name] = 1;
167 ("p%s=1", oneofProp);
169 genVerifyValue(gen, field, i, ref);
171 if (field.optional) gen
176 /* eslint-enable no-unexpected-multiline */