# Copyright (c) 2012 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.

import copy

import json_parse

def DeleteNodes(item, delete_key):
  """Deletes the given nodes in item, recursively, that have |delete_key| as
  an attribute.
  """
  def HasKey(thing):
    return json_parse.IsDict(thing) and thing.get(delete_key, False)

  if json_parse.IsDict(item):
    toDelete = []
    for key, value in item.items():
      if HasKey(value):
        toDelete.append(key)
      else:
        DeleteNodes(value, delete_key)
    for key in toDelete:
      del item[key]
  elif type(item) == list:
    item[:] = [DeleteNodes(thing, delete_key)
        for thing in item if not HasKey(thing)]

  return item


def Load(filename):
  with open(filename, 'r') as handle:
    schemas = json_parse.Parse(handle.read())
  return schemas


# A dictionary mapping |filename| to the object resulting from loading the JSON
# at |filename|.
_cache = {}


def CachedLoad(filename):
  """Equivalent to Load(filename), but caches results for subsequent calls"""
  if filename not in _cache:
    _cache[filename] = Load(filename)
  # Return a copy of the object so that any changes a caller makes won't affect
  # the next caller.
  return copy.deepcopy(_cache[filename])

