智慧水务管理系统 - 精河县供水工程综合管理平台

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. "use strict";
  2. module.exports = verifier;
  3. var Enum = require("./enum"),
  4. util = require("./util");
  5. function invalid(field, expected) {
  6. return field.name + ": " + expected + (field.repeated && expected !== "array" ? "[]" : field.map && expected !== "object" ? "{k:"+field.keyType+"}" : "") + " expected";
  7. }
  8. /**
  9. * Generates a partial value verifier.
  10. * @param {Codegen} gen Codegen instance
  11. * @param {Field} field Reflected field
  12. * @param {number} fieldIndex Field index
  13. * @param {string} ref Variable reference
  14. * @returns {Codegen} Codegen instance
  15. * @ignore
  16. */
  17. function genVerifyValue(gen, field, fieldIndex, ref) {
  18. /* eslint-disable no-unexpected-multiline */
  19. if (field.resolvedType) {
  20. if (field.resolvedType instanceof Enum) { gen
  21. ("switch(%s){", ref)
  22. ("default:")
  23. ("return%j", invalid(field, "enum value"));
  24. for (var keys = Object.keys(field.resolvedType.values), j = 0; j < keys.length; ++j) gen
  25. ("case %i:", field.resolvedType.values[keys[j]]);
  26. gen
  27. ("break")
  28. ("}");
  29. } else {
  30. gen
  31. ("{")
  32. ("var e=types[%i].verify(%s,q+1);", fieldIndex, ref)
  33. ("if(e)")
  34. ("return%j+e", field.name + ".")
  35. ("}");
  36. }
  37. } else {
  38. switch (field.type) {
  39. case "int32":
  40. case "uint32":
  41. case "sint32":
  42. case "fixed32":
  43. case "sfixed32": gen
  44. ("if(!util.isInteger(%s))", ref)
  45. ("return%j", invalid(field, "integer"));
  46. break;
  47. case "int64":
  48. case "uint64":
  49. case "sint64":
  50. case "fixed64":
  51. case "sfixed64": gen
  52. ("if(!util.isInteger(%s)&&!(%s&&util.isInteger(%s.low)&&util.isInteger(%s.high)))", ref, ref, ref, ref)
  53. ("return%j", invalid(field, "integer|Long"));
  54. break;
  55. case "float":
  56. case "double": gen
  57. ("if(typeof %s!==\"number\")", ref)
  58. ("return%j", invalid(field, "number"));
  59. break;
  60. case "bool": gen
  61. ("if(typeof %s!==\"boolean\")", ref)
  62. ("return%j", invalid(field, "boolean"));
  63. break;
  64. case "string": gen
  65. ("if(!util.isString(%s))", ref)
  66. ("return%j", invalid(field, "string"));
  67. break;
  68. case "bytes": gen
  69. ("if(!(%s&&typeof %s.length===\"number\"||util.isString(%s)))", ref, ref, ref)
  70. ("return%j", invalid(field, "buffer"));
  71. break;
  72. }
  73. }
  74. return gen;
  75. /* eslint-enable no-unexpected-multiline */
  76. }
  77. /**
  78. * Generates a partial key verifier.
  79. * @param {Codegen} gen Codegen instance
  80. * @param {Field} field Reflected field
  81. * @param {string} ref Variable reference
  82. * @returns {Codegen} Codegen instance
  83. * @ignore
  84. */
  85. function genVerifyKey(gen, field, ref) {
  86. /* eslint-disable no-unexpected-multiline */
  87. switch (field.keyType) {
  88. case "int32":
  89. case "uint32":
  90. case "sint32":
  91. case "fixed32":
  92. case "sfixed32": gen
  93. ("if(!util.key32Re.test(%s))", ref)
  94. ("return%j", invalid(field, "integer key"));
  95. break;
  96. case "int64":
  97. case "uint64":
  98. case "sint64":
  99. case "fixed64":
  100. case "sfixed64": gen
  101. ("if(!util.key64Re.test(%s))", ref) // see comment above: x is ok, d is not
  102. ("return%j", invalid(field, "integer|Long key"));
  103. break;
  104. case "bool": gen
  105. ("if(!util.key2Re.test(%s))", ref)
  106. ("return%j", invalid(field, "boolean key"));
  107. break;
  108. }
  109. return gen;
  110. /* eslint-enable no-unexpected-multiline */
  111. }
  112. /**
  113. * Generates a verifier specific to the specified message type.
  114. * @param {Type} mtype Message type
  115. * @returns {Codegen} Codegen instance
  116. */
  117. function verifier(mtype) {
  118. /* eslint-disable no-unexpected-multiline */
  119. var gen = util.codegen(["m", "q"])
  120. ("if(typeof m!==\"object\"||m===null)")
  121. ("return%j", "object expected")
  122. ("if(q===undefined)q=0")
  123. ("if(q>util.recursionLimit)")
  124. ("return%j", "max depth exceeded");
  125. var oneofs = mtype.oneofsArray,
  126. seenFirstField = {};
  127. if (oneofs.length) gen
  128. ("var p={}");
  129. for (var i = 0; i < /* initializes */ mtype.fieldsArray.length; ++i) {
  130. var field = mtype._fieldsArray[i].resolve(),
  131. ref = "m" + util.safeProp(field.name);
  132. if (field.optional) gen
  133. ("if(%s!=null&&Object.hasOwnProperty.call(m,%j)){", ref, field.name); // !== undefined && !== null
  134. // map fields
  135. if (field.map) { gen
  136. ("if(!util.isObject(%s))", ref)
  137. ("return%j", invalid(field, "object"))
  138. ("var k=Object.keys(%s)", ref)
  139. ("for(var i=0;i<k.length;++i){");
  140. genVerifyKey(gen, field, "k[i]");
  141. genVerifyValue(gen, field, i, ref + "[k[i]]")
  142. ("}");
  143. // repeated fields
  144. } else if (field.repeated) { gen
  145. ("if(!Array.isArray(%s))", ref)
  146. ("return%j", invalid(field, "array"))
  147. ("for(var i=0;i<%s.length;++i){", ref);
  148. genVerifyValue(gen, field, i, ref + "[i]")
  149. ("}");
  150. // required or present fields
  151. } else {
  152. if (field.partOf) {
  153. var oneofProp = util.safeProp(field.partOf.name);
  154. if (seenFirstField[field.partOf.name] === 1) gen
  155. ("if(p%s===1)", oneofProp)
  156. ("return%j", field.partOf.name + ": multiple values");
  157. seenFirstField[field.partOf.name] = 1;
  158. gen
  159. ("p%s=1", oneofProp);
  160. }
  161. genVerifyValue(gen, field, i, ref);
  162. }
  163. if (field.optional) gen
  164. ("}");
  165. }
  166. return gen
  167. ("return null");
  168. /* eslint-enable no-unexpected-multiline */
  169. }