| # 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) or isinstance(value, unicode): |
| 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 %s (value %s) when printing to GN." % |
| (type(value), value)) |