-
Notifications
You must be signed in to change notification settings - Fork 3.9k
/
cfn-mapping.ts
69 lines (60 loc) · 2.03 KB
/
cfn-mapping.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { CfnRefElement } from './cfn-element';
import { Fn } from './cfn-fn';
import { Construct } from './construct';
import { Token } from './token';
export interface CfnMappingProps {
/**
* Mapping of key to a set of corresponding set of named values.
* The key identifies a map of name-value pairs and must be unique within the mapping.
*
* For example, if you want to set values based on a region, you can create a mapping
* that uses the region name as a key and contains the values you want to specify for
* each specific region.
*
* @default - No mapping.
*/
readonly mapping?: { [k1: string]: { [k2: string]: any } };
}
/**
* Represents a CloudFormation mapping.
*/
export class CfnMapping extends CfnRefElement {
private mapping: { [k1: string]: { [k2: string]: any } } = { };
constructor(scope: Construct, id: string, props: CfnMappingProps = {}) {
super(scope, id);
this.mapping = props.mapping || { };
}
/**
* Sets a value in the map based on the two keys.
*/
public setValue(key1: string, key2: string, value: any) {
if (!(key1 in this.mapping)) {
this.mapping[key1] = { };
}
this.mapping[key1][key2] = value;
}
/**
* @returns A reference to a value in the map based on the two keys.
*/
public findInMap(key1: string, key2: string): string {
// opportunistically check that the key exists (if the key does not contain tokens)
if (!Token.isUnresolved(key1) && !(key1 in this.mapping)) {
throw new Error(`Mapping doesn't contain top-level key '${key1}'`);
}
// opportunistically check that the second key exists (if the key does not contain tokens)
if (!Token.isUnresolved(key1) && !Token.isUnresolved(key2) && !(key2 in this.mapping[key1])) {
throw new Error(`Mapping doesn't contain second-level key '${key2}'`);
}
return Fn.findInMap(this.logicalId, key1, key2);
}
/**
* @internal
*/
public _toCloudFormation(): object {
return {
Mappings: {
[this.logicalId]: this.mapping
}
};
}
}