15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)var schemaRegistry = requireNative('schema_registry'); 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)var CHECK = requireNative('logging').CHECK; 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)var WARNING = requireNative('logging').WARNING; 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// An object forEach. Calls |f| with each (key, value) pair of |obj|, using 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// |self| as the target. 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function forEach(obj, f, self) { 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (var key in obj) { 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if ($Object.hasOwnProperty(obj, key)) 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) $Function.call(f, self, key, obj[key]); 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Assuming |array_of_dictionaries| is structured like this: 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// [{id: 1, ... }, {id: 2, ...}, ...], you can use 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// lookup(array_of_dictionaries, 'id', 2) to get the dictionary with id == 2. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function lookup(array_of_dictionaries, field, value) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var filter = function (dict) {return dict[field] == value;}; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var matches = array_of_dictionaries.filter(filter); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (matches.length == 0) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return undefined; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (matches.length == 1) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return matches[0] 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) throw new Error("Failed lookup of field '" + field + "' with value '" + 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value + "'"); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function loadTypeSchema(typeName, defaultSchema) { 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch var parts = $String.split(typeName, '.'); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (parts.length == 1) { 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (defaultSchema == null) { 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WARNING('Trying to reference "' + typeName + '" ' + 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 'with neither namespace nor default schema.'); 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return null; 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var types = defaultSchema.types; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch var schemaName = $Array.join($Array.slice(parts, 0, parts.length - 1), '.'); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var types = schemaRegistry.GetSchema(schemaName).types; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var i = 0; i < types.length; ++i) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (types[i].id == typeName) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return types[i]; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return null; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exports.forEach = forEach; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)exports.loadTypeSchema = loadTypeSchema; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)exports.lookup = lookup; 57