blob: fb12659b82cafe7b4921f94039033d30027744dd [file] [log] [blame]
#pragma once
#include "config.h"
#include <experimental/optional>
#include <map>
#include <vector>
namespace ibm
{
namespace logging
{
namespace policy
{
/**
* The details of a policy table entry:
* - search modifier
* - error message
* - common error event ID
*/
struct Details
{
std::string modifier;
std::string msg;
std::string ceid;
};
using DetailsList = std::vector<Details>;
using DetailsReference = std::reference_wrapper<const Details>;
using PolicyMap = std::map<std::string, DetailsList>;
namespace optional_ns = std::experimental;
/**
* @class Table
*
* This class wraps the error policy table data, and provides the
* ability to find a policy table entry based on the error and a
* search modifier. This data contains additional information
* about error logs and may be system specific.
*/
class Table
{
public:
Table() = delete;
~Table() = default;
Table(const Table&) = default;
Table& operator=(const Table&) = default;
Table(Table&&) = default;
Table& operator=(Table&&) = default;
/**
* Constructor
*
* @param[in] jsonFile - the path to the policy JSON.
*/
explicit Table(const std::string& jsonFile);
/**
* Says if the JSON has been loaded successfully.
*
* @return bool
*/
inline bool isLoaded() const
{
return loaded;
}
/**
* Finds an entry in the policy table based on the
* error and the search modifier.
*
* @param[in] error - the error, like xyz.openbmc_project.Error.X
* @param[in] modifier - the search modifier, used to find the entry
* when multiple ones share the same error
*
* @return optional<DetailsReference> - the details entry
*/
optional_ns::optional<DetailsReference>
find(const std::string& error, const std::string& modifier) const;
/**
* The default event ID to use when a match in the table
* wasn't found.
*
* @return std::string
*/
inline std::string defaultEID() const
{
return defaultPolicyEID;
}
/**
* The default error message to use when a match in the table
* wasn't found.
*
* @return std::string
*/
inline std::string defaultMsg() const
{
return defaultPolicyMessage;
}
private:
/**
* The default event ID
*/
const std::string defaultPolicyEID{DEFAULT_POLICY_EID};
/**
* The default event message
*/
const std::string defaultPolicyMessage{DEFAULT_POLICY_MSG};
/**
* Loads the JSON data into the PolicyMap map
*
* @param[in] jsonFile - the path to the .json file
*/
void load(const std::string& jsonFile);
/**
* Reflects if the JSON was successfully loaded or not.
*/
bool loaded = false;
/**
* The policy table
*/
PolicyMap policies;
};
} // namespace policy
} // namespace logging
} // namespace ibm