summaryrefslogtreecommitdiff
path: root/json4cpp/tools/generate_natvis/generate_natvis.py
blob: 9266050c5dc8a7e159a820f8780f428249c7b410 (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
40
41
#!/usr/bin/env python3

import argparse
import itertools
import jinja2
import os
import re
import sys

def semver(v):
    if not re.fullmatch(r'\d+\.\d+\.\d+', v):
        raise ValueError
    return v

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--version', required=True, type=semver, help='Library version number')
    parser.add_argument('output', help='Output directory for nlohmann_json.natvis')
    args = parser.parse_args()

    namespaces = ['nlohmann']
    abi_prefix = 'json_abi'
    abi_tags = ['_diag', '_ldvcmp']
    version = '_v' + args.version.replace('.', '_')
    inline_namespaces = []

    # generate all combinations of inline namespace names
    for n in range(0, len(abi_tags) + 1):
        for tags in itertools.combinations(abi_tags, n):
            ns = abi_prefix + ''.join(tags)
            inline_namespaces += [ns, ns + version]

    namespaces += [f'{namespaces[0]}::{ns}' for ns in inline_namespaces]

    env = jinja2.Environment(loader=jinja2.FileSystemLoader(searchpath=sys.path[0]), autoescape=True, trim_blocks=True,
                                                            lstrip_blocks=True, keep_trailing_newline=True)
    template = env.get_template('nlohmann_json.natvis.j2')
    natvis = template.render(namespaces=namespaces)

    with open(os.path.join(args.output, 'nlohmann_json.natvis'), 'w') as f:
        f.write(natvis)