## Note that this file is not auto generated, it is what generates the
## elog-gen.hpp file
// This file was autogenerated.  Do not edit!
// See elog-gen.py for more details
#pragma once

#include <tuple>
#include <type_traits>
#include "log.hpp"

namespace phosphor
{

namespace logging
{

    % for a in errors:
<%
    namespaces = errors[a].split('.')
    classname = namespaces.pop()
%>\
    % for s in namespaces:
namespace ${s}
{
    % endfor

namespace _${classname}
{
    % for b in meta[a]:
struct ${b}
{
    static constexpr auto str = "${meta_data[b]['str']}";
    static constexpr auto str_short = "${meta_data[b]['str_short']}";
    using type = std::tuple<std::decay_t<decltype(str)>,${meta_data[b]['type']}>;
    explicit constexpr ${b}(${meta_data[b]['type']} a) : _entry(entry(str, a)) {};
    type _entry;
};
    % endfor

}  // namespace _${classname}
<% meta_string = ', '.join(meta[a]) %>
struct ${classname}
{
    static constexpr auto err_code = "${errors[a]}";
    static constexpr auto err_msg = "${error_msg[errors[a]]}";
    static constexpr auto L = level::${error_lvl[errors[a]]};
    % for b in meta[a]:
    using ${b} = _${classname}::${b};
    % endfor
    using metadata_types = std::tuple<${meta_string}>;
};

% for s in reversed(namespaces):
} // namespace ${s}
% endfor

    % endfor

} // namespace logging

} // namespace phosphor
