diff options
Diffstat (limited to 'opendc-web/opendc-web-api/opendc/util/path_parser.py')
| -rw-r--r-- | opendc-web/opendc-web-api/opendc/util/path_parser.py | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/opendc-web/opendc-web-api/opendc/util/path_parser.py b/opendc-web/opendc-web-api/opendc/util/path_parser.py new file mode 100644 index 00000000..c8452f20 --- /dev/null +++ b/opendc-web/opendc-web-api/opendc/util/path_parser.py @@ -0,0 +1,36 @@ +import json +import os + + +def parse(version, endpoint_path): + """Map an HTTP endpoint path to an API path""" + + # Get possible paths + with open(os.path.join(os.path.dirname(__file__), '..', 'api', '{}', 'paths.json').format(version)) as paths_file: + paths = json.load(paths_file) + + # Find API path that matches endpoint_path + endpoint_path_parts = endpoint_path.strip('/').split('/') + paths_parts = [x.strip('/').split('/') for x in paths if len(x.strip('/').split('/')) == len(endpoint_path_parts)] + path = None + + for path_parts in paths_parts: + found = True + for (endpoint_part, part) in zip(endpoint_path_parts, path_parts): + if not part.startswith('{') and endpoint_part != part: + found = False + break + if found: + path = path_parts + + if path is None: + return None + + # Extract path parameters + parameters = {} + + for (name, value) in zip(path, endpoint_path_parts): + if name.startswith('{'): + parameters[name.strip('{}')] = value + + return '{}/{}'.format(version, '/'.join(path)), parameters |
