#!/usr/bin/env python3
# Copyright 2020 The Chromium OS 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 module contains shared helper functions for gfx scripts"""

from __future__ import print_function

#import json
import os
import sys
import subprocess
import traceback


def panic(msg: str, exit_code: int = 1):
  """Exits the process with message and error code

  Dumps error message along with callstack and exits the application with
  specified exit code
  """
  print('-' * 60, file=sys.stderr)
  print('ERROR: %s' % msg, file=sys.stderr)
  print('-' * 60, file=sys.stderr)
  traceback.print_exc(file=sys.stderr)
  print('-' * 60, file=sys.stderr)
  sys.exit(exit_code)


def parse_json_file(file_name):
  """Parses the given JSON file and returns the result as a dictionary object"""
  try:
    with open(file_name) as json_file:
      return json.loads(json_file)
  except Exception as e:
    print('ERROR: ' + str(e))
    return None


def parse_cmd_stdout_json(cmd):
  """Parses command's standard output JSON and returns the result as a dictionary object"""
  try:
    result = subprocess.run(
        cmd,
        check=True,
        encoding='utf-8',
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE)
    return json.loads(result.stdout)
  except Exception as e:
    print('ERROR: ' + str(e))
    return None


def parse_script_stdout_json(script, args):
  """Parses script's standard output JSON and returns the result as a dictionary object"""
  cmd = [os.path.join(os.path.dirname(os.path.realpath(__file__)), script)
        ] + args
  return parse_cmd_stdout_json(cmd)
