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