#!/usr/bin/env python
# Copyright 2016 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.

"""This script runs the example_consumer on the example.mojom file. To invoke it
simply run it to see the output of the example_consumer.

This script assumes that its location is
<src_root>/mojom/mojom_parser/examples/run_example.py
This script also assumes that the mojom parser can be found at
<src_root>/mojo/public/tools/bindings/mojom_parser/bin/<os_arch>/mojom_parser
"""
import os
import platform
import subprocess
import sys


def ParseSampleFile():
  """Parses the example mojom file using the mojom parser and returns the
  serialized file graph that is produced.

  Returns:
    A string representation of the serialized file graph if succesful, None
    otherwise.
  """
  system_dirs = {
      ('Linux', '64bit'): 'linux64',
      ('Darwin', '64bit'): 'mac64',
      }
  system = (platform.system(), platform.architecture()[0])
  if system not in system_dirs:
    raise Exception('The mojom parser only supports Linux or Mac 64 bits.')

  examples_dir = os.path.dirname(os.path.abspath(__file__))
  src_root = os.path.join(examples_dir, '../../..')
  mojom_parser = os.path.join(src_root, 'mojo', 'public', 'tools', 'bindings',
      'mojom_parser', 'bin', system_dirs[system], 'mojom_parser')
  if not os.path.exists(mojom_parser):
    raise Exception(
        'The mojom parser could not be found at %s. '
        'You may need to run gclient sync.'
        % mojom_parser)

  examples_mojom = os.path.join(examples_dir, 'example.mojom')
  cmd = [mojom_parser, examples_mojom]

  try:
    return subprocess.check_output(cmd)
  except subprocess.CalledProcessError:
    return None


def RunExampleConsumer(serialized_file_graph):
  """Runs the example consumer on the serialized_file_graph.

  Args:
    serialized_file_graph: mojom_files.MojomFileGraph as output by the mojom
      parser.

  Returns:
    The integer exit code of the example consumer.
  """
  examples_dir = os.path.dirname(os.path.abspath(__file__))
  example_consumer = os.path.join(examples_dir, 'example_consumer.go')
  src_root = os.path.abspath(os.path.join(examples_dir, '../../..'))

  environ = { 'GOPATH': os.path.dirname(src_root) }
  print environ
  cmd = ['go', 'run', example_consumer]
  process = subprocess.Popen(cmd, stdin=subprocess.PIPE, env=environ)
  process.communicate(serialized_file_graph)
  return process.wait()


def main():
  serialized_file_graph = ParseSampleFile()

  if serialized_file_graph:
    return RunExampleConsumer(serialized_file_graph)
  return 1

if __name__ == '__main__':
  sys.exit(main())
