// This file was autogenerated.  Do not edit!
// See elog-gen.py for more details
#pragma once

#include <map>
#include <string>
#include <tuple>
#include <type_traits>
#include <vector>
#include <sdbusplus/exception.hpp>
#include <phosphor-logging/log.hpp>

namespace phosphor
{

namespace logging
{

std::map<std::string,std::vector<std::string>> g_errMetaMapHostEvent = {
     {"org.open_power.Error.Host.Event.Event",{"ESEL"}},
};

std::map<std::string,level> g_errLevelMapHostEvent = {
     {"org.open_power.Error.Host.Event.Event",level::INFO},
};

namespace org
{
namespace open_power
{
namespace Error
{
namespace Host
{
namespace _Event
{
struct ESEL
{
    static constexpr auto str = "ESEL=%s";
    static constexpr auto str_short = "ESEL";
    using type = std::tuple<std::decay_t<decltype(str)>,const char*>;
    explicit constexpr ESEL(const char* a) : _entry(entry(str, a)) {};
    type _entry;
};

}  // namespace _Event

struct Event : public sdbusplus::exception_t
{
    static constexpr auto errName = "org.open_power.Error.Host.Event.Event";
    static constexpr auto errDesc = "A host system event was received";
    static constexpr auto L = level::INFO;
    using ESEL = _Event::ESEL;
    using metadata_types = std::tuple<ESEL>;
    const char* name() const noexcept
    {
        return errName;
    }

    const char* description() const noexcept
    {
        return errDesc;
    }

    const char* what() const noexcept
    {
        return errName;
    }

};
} // namespace Host
} // namespace Error
} // namespace open_power
} // namespace org
} // namespace logging
} // namespace phosphor
