xref: /aosp_15_r20/external/openscreen/tools/convert_to_data_file.py (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard#!/usr/bin/env python3
2*3f982cf4SFabien Sanglard# Copyright 2020 The Chromium Authors. All rights reserved.
3*3f982cf4SFabien Sanglard# Use of this source code is governed by a BSD-style license that can be
4*3f982cf4SFabien Sanglard# found in the LICENSE file.
5*3f982cf4SFabien Sanglard"""
6*3f982cf4SFabien SanglardConverts a data file, e.g. a JSON file, into a C++ raw string that
7*3f982cf4SFabien Sanglardcan be #included.
8*3f982cf4SFabien Sanglard"""
9*3f982cf4SFabien Sanglard
10*3f982cf4SFabien Sanglardimport argparse
11*3f982cf4SFabien Sanglardimport os
12*3f982cf4SFabien Sanglardimport sys
13*3f982cf4SFabien Sanglard
14*3f982cf4SFabien SanglardFORMAT_STRING = """#pragma once
15*3f982cf4SFabien Sanglard
16*3f982cf4SFabien Sanglardnamespace openscreen {{
17*3f982cf4SFabien Sanglardnamespace {0} {{
18*3f982cf4SFabien Sanglard
19*3f982cf4SFabien Sanglardconstexpr char {1}[] = R"(
20*3f982cf4SFabien Sanglard        {2}
21*3f982cf4SFabien Sanglard)";
22*3f982cf4SFabien Sanglard
23*3f982cf4SFabien Sanglard}} // namspace {0}
24*3f982cf4SFabien Sanglard}} // namespace openscreen
25*3f982cf4SFabien Sanglard"""
26*3f982cf4SFabien Sanglard
27*3f982cf4SFabien Sanglard
28*3f982cf4SFabien Sanglarddef ToCamelCase(snake_case):
29*3f982cf4SFabien Sanglard    """Converts snake_case to TitleCamelCase."""
30*3f982cf4SFabien Sanglard    return ''.join(x.title() for x in snake_case.split('_'))
31*3f982cf4SFabien Sanglard
32*3f982cf4SFabien Sanglard
33*3f982cf4SFabien Sanglarddef GetVariableName(path):
34*3f982cf4SFabien Sanglard    """Converts a snake case file name into a kCamelCase variable name."""
35*3f982cf4SFabien Sanglard    file_name = os.path.splitext(os.path.split(path)[1])[0]
36*3f982cf4SFabien Sanglard    return 'k' + ToCamelCase(file_name)
37*3f982cf4SFabien Sanglard
38*3f982cf4SFabien Sanglard
39*3f982cf4SFabien Sanglarddef Convert(namespace, input_path, output_path):
40*3f982cf4SFabien Sanglard    """Takes an input file, such as a JSON file, and converts it into a C++
41*3f982cf4SFabien Sanglard       data file, in the form of a character array constant in a header."""
42*3f982cf4SFabien Sanglard    if not os.path.exists(input_path):
43*3f982cf4SFabien Sanglard        print('\tERROR: failed to generate, invalid path supplied: ' +
44*3f982cf4SFabien Sanglard              input_path)
45*3f982cf4SFabien Sanglard        return 1
46*3f982cf4SFabien Sanglard
47*3f982cf4SFabien Sanglard    content = False
48*3f982cf4SFabien Sanglard    with open(input_path, 'r') as f:
49*3f982cf4SFabien Sanglard        content = f.read()
50*3f982cf4SFabien Sanglard
51*3f982cf4SFabien Sanglard    with open(output_path, 'w') as f:
52*3f982cf4SFabien Sanglard        f.write(
53*3f982cf4SFabien Sanglard            FORMAT_STRING.format(namespace, GetVariableName(input_path),
54*3f982cf4SFabien Sanglard                                 content))
55*3f982cf4SFabien Sanglard
56*3f982cf4SFabien Sanglard
57*3f982cf4SFabien Sanglarddef main():
58*3f982cf4SFabien Sanglard    parser = argparse.ArgumentParser(
59*3f982cf4SFabien Sanglard        description='Convert a file to a C++ data file')
60*3f982cf4SFabien Sanglard    parser.add_argument(
61*3f982cf4SFabien Sanglard        'namespace',
62*3f982cf4SFabien Sanglard        help='Namespace to scope data variable (nested under openscreen)')
63*3f982cf4SFabien Sanglard    parser.add_argument('input_path', help='Path to file to convert')
64*3f982cf4SFabien Sanglard    parser.add_argument('output_path', help='Output path of converted file')
65*3f982cf4SFabien Sanglard    args = parser.parse_args()
66*3f982cf4SFabien Sanglard
67*3f982cf4SFabien Sanglard    input_path = os.path.abspath(args.input_path)
68*3f982cf4SFabien Sanglard    output_path = os.path.abspath(args.output_path)
69*3f982cf4SFabien Sanglard    Convert(args.namespace, input_path, output_path)
70*3f982cf4SFabien Sanglard
71*3f982cf4SFabien Sanglard
72*3f982cf4SFabien Sanglardif __name__ == '__main__':
73*3f982cf4SFabien Sanglard    sys.exit(main())
74