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