Skip to content

Commit ea0df35

Browse files
committed
feat(di): add metadata to Key
1 parent 2a4b63b commit ea0df35

File tree

7 files changed

+58
-9
lines changed

7 files changed

+58
-9
lines changed

modules/di/src/exceptions.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ function constructResolvingPath(keys:List) {
1212
}
1313
}
1414

15+
export class KeyMetadataError extends Error {}
16+
1517
export class ProviderError extends Error {
1618
constructor(key:Key, constructResolvingMessage:Function) {
1719
this.keys = [key];

modules/di/src/injector.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ export class Injector {
4444

4545

4646
_createListOfBindings(flattenBindings):List {
47-
var bindings = ListWrapper.createFixedSize(Key.numberOfKeys() + 1);
47+
var bindings = ListWrapper.createFixedSize(Key.numberOfKeys + 1);
4848
MapWrapper.forEach(flattenBindings, (v, keyId) => bindings[keyId] = v);
4949
return bindings;
5050
}
5151

5252
_createInstances():List {
53-
return ListWrapper.createFixedSize(Key.numberOfKeys() + 1);
53+
return ListWrapper.createFixedSize(Key.numberOfKeys + 1);
5454
}
5555

5656
_getByKey(key:Key, returnPromise:boolean, returnLazy:boolean) {

modules/di/src/key.js

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,44 @@
1+
import {KeyMetadataError} from './exceptions';
12
import {MapWrapper, Map} from 'facade/collection';
23
import {FIELD, int, isPresent} from 'facade/lang';
34

45
var _allKeys = MapWrapper.create();
5-
var _id:int = 0;
66

77
export class Key {
88
@FIELD('final token')
99
@FIELD('final id:int')
10+
@FIELD('metadata:Object')
1011
constructor(token, id:int) {
1112
this.token = token;
1213
this.id = id;
14+
this.metadata = null;
1315
}
1416

15-
static get(token) {
17+
static get(token):Key {
1618
if (token instanceof Key) return token;
1719

1820
if (MapWrapper.contains(_allKeys, token)) {
1921
return MapWrapper.get(_allKeys, token);
2022
}
2123

22-
var newKey = new Key(token, ++_id);
24+
var newKey = new Key(token, Key.numberOfKeys);
2325
MapWrapper.set(_allKeys, token, newKey);
2426
return newKey;
2527
}
2628

27-
static numberOfKeys() {
28-
return _id;
29+
static setMetadata(key:Key, metadata):Key {
30+
if (isPresent(key.metadata) && key.metadata !== metadata) {
31+
throw new KeyMetadataError();
32+
}
33+
key.metadata = metadata;
34+
return key;
35+
}
36+
37+
static clear() {
38+
_allKeys = MapWrapper.create();
39+
}
40+
41+
static get numberOfKeys():int {
42+
return MapWrapper.size(_allKeys);
2943
}
3044
}

modules/di/test/di/key_spec.js

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
import {describe, it, expect} from 'test_lib/test_lib';
1+
import {describe, it, expect, beforeEach} from 'test_lib/test_lib';
22
import {Key} from 'di/di';
33

44
export function main() {
55
describe("key", function () {
6+
beforeEach(function () {
7+
Key.clear();
8+
});
9+
610
it('should be equal to another key if type is the same', function () {
711
expect(Key.get('car')).toBe(Key.get('car'));
812
});
@@ -14,5 +18,32 @@ export function main() {
1418
it('should return the passed in key', function () {
1519
expect(Key.get(Key.get('car'))).toBe(Key.get('car'));
1620
});
21+
22+
describe("metadata", function () {
23+
it("should assign metadata to a key", function () {
24+
var key = Key.get('car');
25+
26+
Key.setMetadata(key, "meta");
27+
28+
expect(key.metadata).toEqual("meta");
29+
});
30+
31+
it("should allow assigning the same metadata twice", function () {
32+
var key = Key.get('car');
33+
34+
Key.setMetadata(key, "meta");
35+
Key.setMetadata(key, "meta");
36+
37+
expect(key.metadata).toEqual("meta");
38+
});
39+
40+
it("should throw when assigning different metadata", function () {
41+
var key = Key.get('car');
42+
43+
Key.setMetadata(key, "meta1");
44+
45+
expect(() => Key.setMetadata(key, "meta2")).toThrowError();
46+
});
47+
});
1748
});
1849
}

modules/facade/src/collection.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class MapWrapper {
1111
static forEach(m, fn) {
1212
m.forEach((k,v) => fn(v,k));
1313
}
14+
static int size(m) {return m.length;}
1415
}
1516

1617
class ListWrapper {

modules/facade/src/collection.es6

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export class MapWrapper {
1010
static forEach(m, fn) {
1111
m.forEach(fn);
1212
}
13+
static size(m) {return m.size;}
1314
}
1415

1516

modules/test_lib/src/test_lib.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Expect expect(actual, [matcher]) {
1515
class Expect extends gns.Expect {
1616
Expect(actual) : super(actual);
1717

18-
void toThrowError(message) => this.toThrowWith(message: message);
18+
void toThrowError([message=""]) => this.toThrowWith(message: message);
1919
void toBePromise() => _expect(actual is Future, equals(true));
2020
Function get _expect => gns.guinness.matchers.expect;
2121
}

0 commit comments

Comments
 (0)