// 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 "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
{
    static constexpr auto err_code = "org.open_power.Error.Host.Event.Event";
    static constexpr auto err_msg = "A host system event was received";
    static constexpr auto L = level::INFO;
    using ESEL = _Event::ESEL;
    using metadata_types = std::tuple<ESEL>;
};
} // namespace Host
} // namespace Error
} // namespace open_power
} // namespace org
} // namespace logging
} // namespace phosphor
