summaryrefslogtreecommitdiff
path: root/opendc/util/path_parser.py
blob: 2f9528b1fa00bdc771ecf39abb39f088200f88de (plain)
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
import json
import sys
import re

def parse(version, endpoint_path):
    """Map an HTTP endpoint path to an API path"""

    # Get possible paths
    with open('opendc/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.split('/') for x in paths if len(x.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('{'):
            try:
                parameters[name.strip('{}')] = int(value)
            except:
                parameters[name.strip('{}')] = value

    return ('{}/{}'.format(version, '/'.join(path)), parameters)