|
14 | 14 | from cfnlint.helpers import AVAILABILITY_ZONES, REGEX_SUB_PARAMETERS
|
15 | 15 | from cfnlint.jsonschema import ValidationError, Validator
|
16 | 16 | from cfnlint.jsonschema._typing import ResolutionResult
|
17 |
| -from cfnlint.jsonschema._utils import equal |
18 | 17 |
|
19 | 18 |
|
20 | 19 | def unresolvable(validator: Validator, instance: Any) -> ResolutionResult:
|
@@ -55,94 +54,50 @@ def find_in_map(validator: Validator, instance: Any) -> ResolutionResult:
|
55 | 54 | ), None
|
56 | 55 | default_value = value
|
57 | 56 |
|
58 |
| - for map_name, map_v, _ in validator.resolve_value(instance[0]): |
59 |
| - if not validator.is_type(map_name, "string"): |
60 |
| - continue |
61 |
| - for top_level_key, top_v, _ in validator.resolve_value(instance[1]): |
62 |
| - if validator.is_type(top_level_key, "integer"): |
63 |
| - top_level_key = str(top_level_key) |
64 |
| - if not validator.is_type(top_level_key, "string"): |
65 |
| - continue |
66 |
| - for second_level_key, second_v, err in validator.resolve_value(instance[2]): |
67 |
| - if validator.is_type(second_level_key, "integer"): |
68 |
| - second_level_key = str(second_level_key) |
69 |
| - if not validator.is_type(second_level_key, "string"): |
70 |
| - continue |
71 |
| - try: |
72 |
| - mappings = list(validator.context.mappings.keys()) |
73 |
| - if not default_value and all( |
74 |
| - not (equal(map_name, each)) for each in mappings |
75 |
| - ): |
76 |
| - yield None, map_v.evolve( |
77 |
| - context=map_v.context.evolve( |
78 |
| - path=map_v.context.path.evolve(value_path=deque([0])), |
79 |
| - ), |
80 |
| - ), ValidationError( |
81 |
| - f"{map_name!r} is not one of {mappings!r}", path=[0] |
82 |
| - ) |
83 |
| - continue |
84 |
| - |
85 |
| - top_level_keys = list( |
86 |
| - validator.context.mappings[map_name].keys.keys() |
87 |
| - ) |
88 |
| - if not default_value and all( |
89 |
| - not (equal(top_level_key, each)) for each in top_level_keys |
90 |
| - ): |
91 |
| - yield None, top_v.evolve( |
92 |
| - context=top_v.context.evolve( |
93 |
| - path=top_v.context.path.evolve(value_path=deque([1])), |
94 |
| - ), |
95 |
| - ), ValidationError( |
96 |
| - f"{top_level_key!r} is not one of {top_level_keys!r}", |
97 |
| - path=[1], |
98 |
| - ) |
99 |
| - continue |
100 |
| - |
101 |
| - second_level_keys = list( |
102 |
| - validator.context.mappings[map_name] |
103 |
| - .keys[top_level_key] |
104 |
| - .keys.keys() |
105 |
| - ) |
106 |
| - if not default_value and all( |
107 |
| - not (equal(second_level_key, each)) |
108 |
| - for each in second_level_keys |
109 |
| - ): |
110 |
| - yield None, second_v.evolve( |
111 |
| - context=second_v.context.evolve( |
112 |
| - path=second_v.context.path.evolve( |
113 |
| - value_path=deque([2]) |
114 |
| - ), |
115 |
| - ), |
116 |
| - ), ValidationError( |
117 |
| - f"{second_level_key!r} is not one of {second_level_keys!r}", |
118 |
| - path=[2], |
119 |
| - ) |
120 |
| - continue |
121 |
| - |
122 |
| - for value in validator.context.mappings[map_name].find_in_map( |
123 |
| - top_level_key, |
124 |
| - second_level_key, |
125 |
| - ): |
126 |
| - yield ( |
127 |
| - value, |
128 |
| - validator.evolve( |
129 |
| - context=validator.context.evolve( |
130 |
| - path=validator.context.path.evolve( |
131 |
| - value_path=deque( |
132 |
| - [ |
133 |
| - "Mappings", |
134 |
| - map_name, |
135 |
| - top_level_key, |
136 |
| - second_level_key, |
137 |
| - ] |
138 |
| - ) |
139 |
| - ) |
140 |
| - ) |
141 |
| - ), |
142 |
| - None, |
143 |
| - ) |
144 |
| - except KeyError: |
145 |
| - pass |
| 57 | + if ( |
| 58 | + validator.is_type(instance[0], "string") |
| 59 | + and ( |
| 60 | + validator.is_type(instance[1], "string") |
| 61 | + or validator.is_type(instance[1], "integer") |
| 62 | + ) |
| 63 | + and validator.is_type(instance[2], "string") |
| 64 | + ): |
| 65 | + map = validator.context.mappings.get(instance[0]) |
| 66 | + if not map: |
| 67 | + if not default_value: |
| 68 | + yield None, validator, ValidationError( |
| 69 | + ( |
| 70 | + f"{instance[0]!r} is not one of " |
| 71 | + f"{list(validator.context.mappings.keys())!r}" |
| 72 | + ), |
| 73 | + path=deque([0]), |
| 74 | + ) |
| 75 | + return |
| 76 | + |
| 77 | + top_key = map.keys.get(instance[1]) |
| 78 | + if not top_key: |
| 79 | + if not default_value: |
| 80 | + yield None, validator, ValidationError( |
| 81 | + ( |
| 82 | + f"{instance[1]!r} is not one of " |
| 83 | + f"{list(map.keys.keys())!r} for " |
| 84 | + f"mapping {instance[0]!r}" |
| 85 | + ), |
| 86 | + path=deque([1]), |
| 87 | + ) |
| 88 | + return |
| 89 | + |
| 90 | + value = top_key.keys.get(instance[2]) |
| 91 | + if not value: |
| 92 | + if not default_value: |
| 93 | + yield default_value, validator, ValidationError( |
| 94 | + ( |
| 95 | + f"{instance[2]!r} is not one of " |
| 96 | + f"{list(top_key.keys.keys())!r} for mapping " |
| 97 | + f"{instance[0]!r} and key {instance[1]!r}" |
| 98 | + ), |
| 99 | + path=deque([2]), |
| 100 | + ) |
146 | 101 |
|
147 | 102 |
|
148 | 103 | def get_azs(validator: Validator, instance: Any) -> ResolutionResult:
|
|
0 commit comments