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