HarshvardhanCn01/Voice-Assistant
0
1"use strict";2/**3 * Runtime message from/to plain object converters.4 * @namespace5 */6var converter = exports;7 8var Enum = require("./enum"),9 util = require("./util");10 11/**12 * Generates a partial value fromObject conveter.13 * @param {Codegen} gen Codegen instance14 * @param {Field} field Reflected field15 * @param {number} fieldIndex Field index16 * @param {string} prop Property reference17 * @returns {Codegen} Codegen instance18 * @ignore19 */20function genValuePartial_fromObject(gen, field, fieldIndex, prop) {21 var defaultAlreadyEmitted = false;22 /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */23 if (field.resolvedType) {24 if (field.resolvedType instanceof Enum) { gen25 ("switch(d%s){", prop);26 for (var values = field.resolvedType.values, keys = Object.keys(values), i = 0; i < keys.length; ++i) {27 // enum unknown values passthrough28 if (values[keys[i]] === field.typeDefault && !defaultAlreadyEmitted) { gen29 ("default:")30 ("if(typeof(d%s)===\"number\"){m%s=d%s;break}", prop, prop, prop);31 if (!field.repeated) gen // fallback to default value only for32 // arrays, to avoid leaving holes.33 ("break"); // for non-repeated fields, just ignore34 defaultAlreadyEmitted = true;35 }36 gen37 ("case%j:", keys[i])38 ("case %i:", values[keys[i]])39 ("m%s=%j", prop, values[keys[i]])40 ("break");41 } gen42 ("}");43 } else gen44 ("if(typeof d%s!==\"object\")", prop)45 ("throw TypeError(%j)", field.fullName + ": object expected")46 ("m%s=types[%i].fromObject(d%s)", prop, fieldIndex, prop);47 } else {48 var isUnsigned = false;49 switch (field.type) {50 case "double":51 case "float": gen52 ("m%s=Number(d%s)", prop, prop); // also catches "NaN", "Infinity"53 break;54 case "uint32":55 case "fixed32": gen56 ("m%s=d%s>>>0", prop, prop);57 break;58 case "int32":59 case "sint32":60 case "sfixed32": gen61 ("m%s=d%s|0", prop, prop);62 break;63 case "uint64":64 isUnsigned = true;65 // eslint-disable-next-line no-fallthrough66 case "int64":67 case "sint64":68 case "fixed64":69 case "sfixed64": gen70 ("if(util.Long)")71 ("(m%s=util.Long.fromValue(d%s)).unsigned=%j", prop, prop, isUnsigned)72 ("else if(typeof d%s===\"string\")", prop)73 ("m%s=parseInt(d%s,10)", prop, prop)74 ("else if(typeof d%s===\"number\")", prop)75 ("m%s=d%s", prop, prop)76 ("else if(typeof d%s===\"object\")", prop)77 ("m%s=new util.LongBits(d%s.low>>>0,d%s.high>>>0).toNumber(%s)", prop, prop, prop, isUnsigned ? "true" : "");78 break;79 case "bytes": gen80 ("if(typeof d%s===\"string\")", prop)81 ("util.base64.decode(d%s,m%s=util.newBuffer(util.base64.length(d%s)),0)", prop, prop, prop)82 ("else if(d%s.length >= 0)", prop)83 ("m%s=d%s", prop, prop);84 break;85 case "string": gen86 ("m%s=String(d%s)", prop, prop);87 break;88 case "bool": gen89 ("m%s=Boolean(d%s)", prop, prop);90 break;91 /* default: gen92 ("m%s=d%s", prop, prop);93 break; */94 }95 }96 return gen;97 /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */98}99 100/**101 * Generates a plain object to runtime message converter specific to the specified message type.102 * @param {Type} mtype Message type103 * @returns {Codegen} Codegen instance104 */105converter.fromObject = function fromObject(mtype) {106 /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */107 var fields = mtype.fieldsArray;108 var gen = util.codegen(["d"], mtype.name + "$fromObject")109 ("if(d instanceof this.ctor)")110 ("return d");111 if (!fields.length) return gen112 ("return new this.ctor");113 gen114 ("var m=new this.ctor");115 for (var i = 0; i < fields.length; ++i) {116 var field = fields[i].resolve(),117 prop = util.safeProp(field.name);118 119 // Map fields120 if (field.map) { gen121 ("if(d%s){", prop)122 ("if(typeof d%s!==\"object\")", prop)123 ("throw TypeError(%j)", field.fullName + ": object expected")124 ("m%s={}", prop)125 ("for(var ks=Object.keys(d%s),i=0;i<ks.length;++i){", prop);126 genValuePartial_fromObject(gen, field, /* not sorted */ i, prop + "[ks[i]]")127 ("}")128 ("}");129 130 // Repeated fields131 } else if (field.repeated) { gen132 ("if(d%s){", prop)133 ("if(!Array.isArray(d%s))", prop)134 ("throw TypeError(%j)", field.fullName + ": array expected")135 ("m%s=[]", prop)136 ("for(var i=0;i<d%s.length;++i){", prop);137 genValuePartial_fromObject(gen, field, /* not sorted */ i, prop + "[i]")138 ("}")139 ("}");140 141 // Non-repeated fields142 } else {143 if (!(field.resolvedType instanceof Enum)) gen // no need to test for null/undefined if an enum (uses switch)144 ("if(d%s!=null){", prop); // !== undefined && !== null145 genValuePartial_fromObject(gen, field, /* not sorted */ i, prop);146 if (!(field.resolvedType instanceof Enum)) gen147 ("}");148 }149 } return gen150 ("return m");151 /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */152};153 154/**155 * Generates a partial value toObject converter.156 * @param {Codegen} gen Codegen instance157 * @param {Field} field Reflected field158 * @param {number} fieldIndex Field index159 * @param {string} prop Property reference160 * @returns {Codegen} Codegen instance161 * @ignore162 */163function genValuePartial_toObject(gen, field, fieldIndex, prop) {164 /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */165 if (field.resolvedType) {166 if (field.resolvedType instanceof Enum) gen167 ("d%s=o.enums===String?(types[%i].values[m%s]===undefined?m%s:types[%i].values[m%s]):m%s", prop, fieldIndex, prop, prop, fieldIndex, prop, prop);168 else gen169 ("d%s=types[%i].toObject(m%s,o)", prop, fieldIndex, prop);170 } else {171 var isUnsigned = false;172 switch (field.type) {173 case "double":174 case "float": gen175 ("d%s=o.json&&!isFinite(m%s)?String(m%s):m%s", prop, prop, prop, prop);176 break;177 case "uint64":178 isUnsigned = true;179 // eslint-disable-next-line no-fallthrough180 case "int64":181 case "sint64":182 case "fixed64":183 case "sfixed64": gen184 ("if(typeof m%s===\"number\")", prop)185 ("d%s=o.longs===String?String(m%s):m%s", prop, prop, prop)186 ("else") // Long-like187 ("d%s=o.longs===String?util.Long.prototype.toString.call(m%s):o.longs===Number?new util.LongBits(m%s.low>>>0,m%s.high>>>0).toNumber(%s):m%s", prop, prop, prop, prop, isUnsigned ? "true": "", prop);188 break;189 case "bytes": gen190 ("d%s=o.bytes===String?util.base64.encode(m%s,0,m%s.length):o.bytes===Array?Array.prototype.slice.call(m%s):m%s", prop, prop, prop, prop, prop);191 break;192 default: gen193 ("d%s=m%s", prop, prop);194 break;195 }196 }197 return gen;198 /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */199}200 201/**202 * Generates a runtime message to plain object converter specific to the specified message type.203 * @param {Type} mtype Message type204 * @returns {Codegen} Codegen instance205 */206converter.toObject = function toObject(mtype) {207 /* eslint-disable no-unexpected-multiline, block-scoped-var, no-redeclare */208 var fields = mtype.fieldsArray.slice().sort(util.compareFieldsById);209 if (!fields.length)210 return util.codegen()("return {}");211 var gen = util.codegen(["m", "o"], mtype.name + "$toObject")212 ("if(!o)")213 ("o={}")214 ("var d={}");215 216 var repeatedFields = [],217 mapFields = [],218 normalFields = [],219 i = 0;220 for (; i < fields.length; ++i)221 if (!fields[i].partOf)222 ( fields[i].resolve().repeated ? repeatedFields223 : fields[i].map ? mapFields224 : normalFields).push(fields[i]);225 226 if (repeatedFields.length) { gen227 ("if(o.arrays||o.defaults){");228 for (i = 0; i < repeatedFields.length; ++i) gen229 ("d%s=[]", util.safeProp(repeatedFields[i].name));230 gen231 ("}");232 }233 234 if (mapFields.length) { gen235 ("if(o.objects||o.defaults){");236 for (i = 0; i < mapFields.length; ++i) gen237 ("d%s={}", util.safeProp(mapFields[i].name));238 gen239 ("}");240 }241 242 if (normalFields.length) { gen243 ("if(o.defaults){");244 for (i = 0; i < normalFields.length; ++i) {245 var field = normalFields[i],246 prop = util.safeProp(field.name);247 if (field.resolvedType instanceof Enum) gen248 ("d%s=o.enums===String?%j:%j", prop, field.resolvedType.valuesById[field.typeDefault], field.typeDefault);249 else if (field.long) gen250 ("if(util.Long){")251 ("var n=new util.Long(%i,%i,%j)", field.typeDefault.low, field.typeDefault.high, field.typeDefault.unsigned)252 ("d%s=o.longs===String?n.toString():o.longs===Number?n.toNumber():n", prop)253 ("}else")254 ("d%s=o.longs===String?%j:%i", prop, field.typeDefault.toString(), field.typeDefault.toNumber());255 else if (field.bytes) {256 var arrayDefault = "[" + Array.prototype.slice.call(field.typeDefault).join(",") + "]";257 gen258 ("if(o.bytes===String)d%s=%j", prop, String.fromCharCode.apply(String, field.typeDefault))259 ("else{")260 ("d%s=%s", prop, arrayDefault)261 ("if(o.bytes!==Array)d%s=util.newBuffer(d%s)", prop, prop)262 ("}");263 } else gen264 ("d%s=%j", prop, field.typeDefault); // also messages (=null)265 } gen266 ("}");267 }268 var hasKs2 = false;269 for (i = 0; i < fields.length; ++i) {270 var field = fields[i],271 index = mtype._fieldsArray.indexOf(field),272 prop = util.safeProp(field.name);273 if (field.map) {274 if (!hasKs2) { hasKs2 = true; gen275 ("var ks2");276 } gen277 ("if(m%s&&(ks2=Object.keys(m%s)).length){", prop, prop)278 ("d%s={}", prop)279 ("for(var j=0;j<ks2.length;++j){");280 genValuePartial_toObject(gen, field, /* sorted */ index, prop + "[ks2[j]]")281 ("}");282 } else if (field.repeated) { gen283 ("if(m%s&&m%s.length){", prop, prop)284 ("d%s=[]", prop)285 ("for(var j=0;j<m%s.length;++j){", prop);286 genValuePartial_toObject(gen, field, /* sorted */ index, prop + "[j]")287 ("}");288 } else { gen289 ("if(m%s!=null&&m.hasOwnProperty(%j)){", prop, field.name); // !== undefined && !== null290 genValuePartial_toObject(gen, field, /* sorted */ index, prop);291 if (field.partOf) gen292 ("if(o.oneofs)")293 ("d%s=%j", util.safeProp(field.partOf.name), field.name);294 }295 gen296 ("}");297 }298 return gen299 ("return d");300 /* eslint-enable no-unexpected-multiline, block-scoped-var, no-redeclare */301};302 