# Copyright (c) 2013 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 module holds utilities which make writing recipes easier."""

import json


class Recipe(object):
  """Base class for all recipes.

  Provides methods that are expected to be overridden by child classes. Also
  provides an command-line parsing method that converts the unified command-line
  interface used in depot_tools to the unified python interface defined here."""

  @staticmethod
  def fetch_spec(_props):
    """Returns instructions to check out the project, conditioned on |props|."""
    raise NotImplementedError

  @staticmethod
  def expected_root(_props):
    """Returns the directory into which the checkout will be performed."""
    raise NotImplementedError

  def handle_args(self, argv):
    """Passes the command-line arguments through to the appropriate method."""
    methods = {'fetch': self.fetch_spec,
               'root':  self.expected_root}
    if len(argv) <= 1 or argv[1] not in methods:
      print 'Must specify a a fetch/root action'
      return 1

    def looks_like_arg(arg):
      return arg.startswith('--') and arg.count('=') == 1

    bad_parms = [x for x in argv[2:] if not looks_like_arg(x)]
    if bad_parms:
      print 'Got bad arguments %s' % bad_parms
      return 1

    method = methods[argv[1]]
    props = dict(x.split('=', 1) for x in (y.lstrip('-') for y in argv[2:]))

    self.output(method(props))

  @staticmethod
  def output(data):
    print(json.dumps(data))
