xref: /openbmc/phosphor-logging/tools/phosphor-logging/templates/elog-gen-template.hpp.mako (revision b60359105f0b08d53530e8e313d8ea12968977dc)
1## Note that this file is not auto generated, it is what generates the
2## elog-gen.hpp file
3// This file was autogenerated.  Do not edit!
4// See elog-gen.py for more details
5#pragma once
6
7#include <phosphor-logging/elog.hpp>
8#include <phosphor-logging/log.hpp>
9#include <sdbusplus/exception.hpp>
10#include <string>
11#include <tuple>
12#include <type_traits>
13
14<%
15import inflection
16
17def sdbusplus_name(name):
18    if "example.xyz.openbmc_project" in name:
19        names = name.split(".")
20    else:
21        names = ["sdbusplus", "error" ] + name.split(".")
22
23    classname = inflection.camelize(names[-1])
24    namespace_name = "::".join([inflection.underscore(x) for x in names[:-1]])
25
26    return (namespace_name, classname)
27
28def phosphor_name(name):
29    namespace_name, classname = sdbusplus_name(name)
30    namespace_name = namespace_name.replace("sdbusplus::error::", "")
31
32    return (namespace_name, classname)
33
34def old_phosphor_name(name):
35    names = name.split(".")
36    return ("::".join(names[:-1]), names[-1])
37
38exceptions = sorted(
39    set([x for x in errors if "example.xyz.openbmc_project" not in x]))
40%>\
41% for error in exceptions:
42<%
43    ns, exception_name = sdbusplus_name(error)
44%>\
45namespace ${ns}
46{
47struct ${exception_name};
48} // namespace ${ns}
49% endfor
50
51namespace phosphor::logging
52{
53
54% for name in errors:
55<%
56    namespaces, classname = phosphor_name(name)
57    meta_list = meta.get(name, [])
58%>\
59namespace ${namespaces}
60{
61    % if len(meta_list) != 0:
62namespace _${classname}
63{
64        % for b in meta_list:
65struct ${b}
66{
67    /*
68     * We can't use -fsanitize=undefined if we declare a
69     * 'static constexpr auto str' member, so don't. Instead, open-code the
70     * mako template lookups.
71     */
72    static constexpr auto str_short = "${meta_data[b]['str_short']}";
73    using type = std::tuple<std::decay_t<decltype("${meta_data[b]['str']}")>,${meta_data[b]['type']}>;
74    explicit constexpr ${b}(${meta_data[b]['type']} a) : _entry(entry("${meta_data[b]['str']}", a)) {};
75    type _entry;
76};
77        % endfor
78} // namespace _${classname}
79    % endif
80<%
81    example_yaml = "example.xyz.openbmc_project" in name
82
83    meta_string = ""
84    if(meta_list):
85        meta_string = ', '.join(meta_list)
86    parent_meta = []
87
88    parent = parents[name]
89    while parent:
90        parent_ns, parent_class = phosphor_name(parent)
91
92        parent_meta += [parent_ns + "::" + parent_class + "::" +
93                        p for p in meta[parent]]
94        parent_meta_short = ', '.join(meta[parent])
95
96        # The parent may have empty meta,
97        # so only add parent meta when it exists
98        if (parent_meta_short):
99            if(meta_string):
100                meta_string = meta_string + ", " + parent_meta_short
101            else:
102                meta_string = parent_meta_short
103        parent = parents[parent]
104
105    if example_yaml:
106        error_type = classname + " : public sdbusplus::exception_t"
107    else:
108        error_type = classname
109%>
110struct ${error_type}
111{
112    % if example_yaml:
113    static constexpr auto errName = "${name}";
114    static constexpr auto errDesc = "${error_msg[name]}";
115    % endif
116    static constexpr auto L = level::${error_lvl[name]};
117    % for b in meta_list:
118    using ${b} = _${classname}::${b};
119    % endfor
120    % for b in parent_meta:
121    using ${b.split("::")[-1]} =
122        phosphor::logging::${b};
123    % endfor
124    using metadata_types = std::tuple<${meta_string}>;
125    % if example_yaml:
126
127    const char* name() const noexcept override
128    {
129        return errName;
130    }
131
132    const char* description() const noexcept override
133    {
134        return errDesc;
135    }
136
137    const char* what() const noexcept override
138    {
139        return errName;
140    }
141
142    int get_errno() const noexcept override
143    {
144        return EIO;
145    }
146    % endif
147};
148
149} // namespace ${namespaces}
150<%
151    old_ns, old_class = old_phosphor_name(name)
152%>
153    % if old_ns != namespaces or old_class != classname:
154#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
155namespace ${old_ns}
156{
157using ${old_class} =
158    phosphor::logging::${namespaces}::${classname};
159}
160#endif
161    % endif
162
163    % if not example_yaml:
164<%
165    sdbusplus_ns, sdbusplus_class = sdbusplus_name(name)
166%>\
167namespace details
168{
169
170template <>
171struct map_exception_type<${sdbusplus_ns}::${sdbusplus_class}>
172{
173    using type =
174        phosphor::logging::${namespaces}::${classname};
175};
176
177} // namespace details
178    %endif
179% endfor
180} // namespace phosphor::logging
181