# Copyright 2019 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.

from recipe_engine import recipe_api


class YamlApi(recipe_api.RecipeApi):
  """Provides utilities to parse yaml files."""

  def read(self, step_name, file_path, json_place_holder):
    """Reads a yaml file.

    It currently shells out to a script which converts the yaml to json,
    this way it can use vpython3 to import pyyaml. To achieve the same
    from the recipe we need to specify pyyaml at the root file. Please
    change this behavior to be inline if it becomes easier to specify
    vpython3 packages dependencies in a recipe module.

    Args:
      step_name: (str) the name of the step for reading the yaml.
      file_path: (str) the path to the yaml file.
      json_place_holder: (JsonOutputPlaceholder) for the parsed yaml content.
    Returns:
      StepData with the result from the step.
    """
    with self.m.step.nest(step_name) as presentation:
      content = self.m.file.read_text('read', file_path)
      presentation.logs['yaml'] = content
      return self.m.step(
          'parse', [
              'vpython3',
              self.resource('parse_yaml.py'), '--yaml_file', file_path,
              '--json_file',
              self.m.json.output()
          ],
          infra_step=True
      )
