#pragma once #include #include #include #include #include #include namespace phosphor { namespace network { namespace config { using Section = std::string; using KeyValueMap = std::multimap; using ValueList = std::vector; namespace fs = std::experimental::filesystem; enum class ReturnCode { SUCCESS = 0x0, SECTION_NOT_FOUND = 0x1, KEY_NOT_FOUND = 0x2, }; class Parser { public: Parser() = default; /** @brief Constructor * @param[in] fileName - Absolute path of the file which will be parsed. */ Parser(const fs::path& fileName); /** @brief Get the values of the given key and section. * @param[in] section - section name. * @param[in] key - key to look for. * @returns the tuple of return code and the * values associated with the key. */ std::tuple getValues(const std::string& section, const std::string& key); /** @brief Set the value of the given key and section. * @param[in] section - section name. * @param[in] key - key name. * @param[in] value - value. */ void setValue(const std::string& section, const std::string& key, const std::string& value); /** @brief Set the file name and parse it. * @param[in] fileName - Absolute path of the file. */ void setFile(const fs::path& fileName); private: /** @brief Parses the given file and fills the data. * @param[in] stream - inputstream. */ void parse(std::istream& stream); /** @brief Get all the key values of the given section. * @param[in] section - section name. * @returns the tuple of return code and the map of (key,value). */ std::tuple getSection(const std::string& section); /** @brief checks that whether the value exist in the * given section. * @param[in] section - section name. * @param[in] key - key name. * @param[in] value - value. * @returns true if exist otherwise false. */ bool isValueExist(const std::string& section, const std::string& key, const std::string& value); std::unordered_map sections; fs::path filePath; }; } // namespace config } // namespace network } // namespace phosphor