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

import ConfigParser
import error


def forgive_config_error(func):
    """A decorator to make ConfigParser get*() functions return None on fail."""
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except ConfigParser.Error:
            return None
        except ValueError as e:
            raise error.MalformedConfigEntry(str(e))
    return wrapper


class ForgivingConfigParser(ConfigParser.SafeConfigParser):
    """A SafeConfigParser that returns None on any error in get*().

    Also implements reread(), which allows any already-read-in configs to be
    reloaded from disk on-demand.

    Note that I can't use super() here, as ConfigParser.SafeConfigParser
    isn't a new-style class.

    @var _cached_config_file_names: the names of the config files last read().
    """


    def __init__(self):
        ConfigParser.SafeConfigParser.__init__(self)
        self._cached_config_file_names = ''


    def read(self, filenames):
        """Caches filenames, then performs normal read() functionality.

        @param filenames: string or iterable.  The files to read.
        @return list of files that could not be read, as per super class.
        """
        to_return = ConfigParser.SafeConfigParser.read(self, filenames)
        self._cached_config_file_names = filenames
        return to_return


    def reread(self):
        """Clear all sections, re-read configs from disk."""
        for section in self.sections():
            self.remove_section(section)
        return ConfigParser.SafeConfigParser.read(
            self, self._cached_config_file_names)


    @forgive_config_error
    def getstring(self, section, option):
        """Can't override get(), as it breaks the other getters to have get()
        return None sometimes."""
        return ConfigParser.SafeConfigParser.get(self, section, option)


    @forgive_config_error
    def getint(self, section, option):
        return ConfigParser.SafeConfigParser.getint(self, section, option)


    @forgive_config_error
    def getfloat(self, section, option):
        return ConfigParser.SafeConfigParser.getfloat(self, section, option)


    @forgive_config_error
    def getboolean(self, section, option):
        return ConfigParser.SafeConfigParser.getboolean(self, section, option)
