| # Copyright 2014 The Chromium Authors. All rights reserved. | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 | """Helper functions useful when writing scripts that are run from GN's | 
 | exec_script function.""" | 
 |  | 
 |  | 
 | class GNException(Exception): | 
 |     pass | 
 |  | 
 |  | 
 | def ToGNString(value, allow_dicts=True): | 
 |     """Prints the given value to stdout. | 
 |  | 
 |   allow_dicts indicates if this function will allow converting dictionaries | 
 |   to GN scopes. This is only possible at the top level, you can't nest a | 
 |   GN scope in a list, so this should be set to False for recursive calls.""" | 
 |     if isinstance(value, str): | 
 |         if value.find('\n') >= 0: | 
 |             raise GNException("Trying to print a string with a newline in it.") | 
 |         return '"' + value.replace('"', '\\"') + '"' | 
 |  | 
 |     if isinstance(value, list): | 
 |         return '[ %s ]' % ', '.join(ToGNString(v) for v in value) | 
 |  | 
 |     if isinstance(value, dict): | 
 |         if not allow_dicts: | 
 |             raise GNException("Attempting to recursively print a dictionary.") | 
 |         result = "" | 
 |         for key in value: | 
 |             if not isinstance(key, str): | 
 |                 raise GNException("Dictionary key is not a string.") | 
 |             result += "%s = %s\n" % (key, ToGNString(value[key], False)) | 
 |         return result | 
 |  | 
 |     if isinstance(value, int): | 
 |         return str(value) | 
 |  | 
 |     raise GNException("Unsupported type when printing to GN.") |