1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 var schemaRegistry
= requireNative('schema_registry');
6 var CHECK
= requireNative('logging').CHECK
;
7 var WARNING
= requireNative('logging').WARNING
;
9 // An object forEach. Calls |f| with each (key, value) pair of |obj|, using
10 // |self| as the target.
11 function forEach(obj
, f
, self
) {
12 for (var key
in obj
) {
13 if ($Object
.hasOwnProperty(obj
, key
))
14 $Function
.call(f
, self
, key
, obj
[key
]);
18 // Assuming |array_of_dictionaries| is structured like this:
19 // [{id: 1, ... }, {id: 2, ...}, ...], you can use
20 // lookup(array_of_dictionaries, 'id', 2) to get the dictionary with id == 2.
21 function lookup(array_of_dictionaries
, field
, value
) {
22 var filter = function (dict
) {return dict
[field
] == value
;};
23 var matches
= array_of_dictionaries
.filter(filter
);
24 if (matches
.length
== 0) {
26 } else if (matches
.length
== 1) {
29 throw new Error("Failed lookup of field '" + field
+ "' with value '" +
34 function loadTypeSchema(typeName
, defaultSchema
) {
35 var parts
= $String
.split(typeName
, '.');
36 if (parts
.length
== 1) {
37 if (defaultSchema
== null) {
38 WARNING('Trying to reference "' + typeName
+ '" ' +
39 'with neither namespace nor default schema.');
42 var types
= defaultSchema
.types
;
44 var schemaName
= $Array
.join($Array
.slice(parts
, 0, parts
.length
- 1), '.');
45 var types
= schemaRegistry
.GetSchema(schemaName
).types
;
47 for (var i
= 0; i
< types
.length
; ++i
) {
48 if (types
[i
].id
== typeName
)
54 // expose takes a private class implementation |cls| and exposes a subset of its
55 // methods |funcs| and properties |props| in a public wrapper class that it
57 function expose(cls
, funcs
, props
) {
58 function publicClass() {
59 var privateObj
= $Object
.create(cls
.prototype);
60 $Function
.apply(cls
, privateObj
, arguments
);
61 privateObj
.wrapper
= this;
62 privates(this).impl
= privateObj
;
66 $Array
.forEach(funcs
, function(func
) {
67 publicClass
.prototype[func
] = function() {
68 var impl
= privates(this).impl
;
69 return $Function
.apply(impl
[func
], impl
, arguments
);
75 $Array
.forEach(props
, function(prop
) {
76 $Object
.defineProperty(publicClass
.prototype, prop
, {
79 return privates(this).impl
[prop
];
81 set: function(value
) {
82 var impl
= privates(this).impl
;
93 exports
.forEach
= forEach
;
94 exports
.loadTypeSchema
= loadTypeSchema
;
95 exports
.lookup
= lookup
;
96 exports
.expose
= expose
;