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

"""Basic .ini encoding and decoding."""

from __future__ import absolute_import
import contextlib
import os


def loads(ini_str, strict=True):
  ret = {}
  for line in ini_str.splitlines():
    key, val = line.split('=', 1)
    key = key.strip()
    val = val.strip()
    if strict and key in ret:
      raise ValueError('Multiple entries present for key "%s"' % key)
    ret[key] = val

  return ret


def load(fp):
  return loads(fp.read())


def dumps(obj):
  ret = ''
  for k, v in sorted(obj.items()):
    ret += '%s = %s\n' % (k, str(v))
  return ret


def dump(obj, fp):
  fp.write(dumps(obj))


@contextlib.contextmanager
def update_ini_file(ini_file_path):
  """Load and update the contents of an ini file.

  Args:
    ini_file_path: A string containing the absolute path of the ini file.
  Yields:
    The contents of the file, as a dict
  """
  if os.path.exists(ini_file_path):
    with open(ini_file_path) as ini_file:
      ini_contents = load(ini_file)
  else:
    ini_contents = {}

  yield ini_contents

  with open(ini_file_path, 'w') as ini_file:
    dump(ini_contents, ini_file)
