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

#include <phosphor-logging/elog.hpp>
#include <phosphor-logging/log.hpp>
#include <sdbusplus/exception.hpp>

#include <string>
#include <tuple>
#include <type_traits>

namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct GPUOverTemp;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct GPUPowerFault;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct MemoryPowerFault;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct PowerOnFailure;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct PowerSequencerFault;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct PowerSequencerPGOODFault;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct PowerSequencerVoltageFault;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct PowerSupplyFanFault;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct PowerSupplyInputFault;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct PowerSupplyOutputOvercurrent;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct PowerSupplyOutputOvervoltage;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct PowerSupplyShouldBeOn;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct PowerSupplyTemperatureFault;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct Shutdown;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::xyz::openbmc_project::common::callout
{
struct Device;
} // namespace sdbusplus::error::xyz::openbmc_project::common::callout
namespace sdbusplus::error::xyz::openbmc_project::common::callout
{
struct GPIO;
} // namespace sdbusplus::error::xyz::openbmc_project::common::callout
namespace sdbusplus::error::xyz::openbmc_project::common::callout
{
struct IIC;
} // namespace sdbusplus::error::xyz::openbmc_project::common::callout
namespace sdbusplus::error::xyz::openbmc_project::common::callout
{
struct IPMISensor;
} // namespace sdbusplus::error::xyz::openbmc_project::common::callout
namespace sdbusplus::error::xyz::openbmc_project::common::callout
{
struct Inventory;
} // namespace sdbusplus::error::xyz::openbmc_project::common::callout

namespace phosphor::logging
{

namespace org::open_power::witherspoon::fault
{

struct Shutdown
{
    static constexpr auto L = level::ERR;
    using metadata_types = std::tuple<>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using Shutdown =
    phosphor::logging::org::open_power::witherspoon::fault::Shutdown;
}
#endif

namespace details
{

template <>
struct map_exception_type<
    sdbusplus::error::org::open_power::witherspoon::fault::Shutdown>
{
    using type =
        phosphor::logging::org::open_power::witherspoon::fault::Shutdown;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{

struct PowerOnFailure
{
    static constexpr auto L = level::ERR;
    using metadata_types = std::tuple<>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using PowerOnFailure =
    phosphor::logging::org::open_power::witherspoon::fault::PowerOnFailure;
}
#endif

namespace details
{

template <>
struct map_exception_type<
    sdbusplus::error::org::open_power::witherspoon::fault::PowerOnFailure>
{
    using type =
        phosphor::logging::org::open_power::witherspoon::fault::PowerOnFailure;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{
namespace _PowerSequencerVoltageFault
{
struct RAIL
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAIL";
    using type = std::tuple<std::decay_t<decltype("RAIL=%d")>, uint16_t>;
    explicit constexpr RAIL(uint16_t a) : _entry(entry("RAIL=%d", a)){};
    type _entry;
};
struct RAIL_NAME
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAIL_NAME";
    using type =
        std::tuple<std::decay_t<decltype("RAIL_NAME=%s")>, const char*>;
    explicit constexpr RAIL_NAME(const char* a) :
        _entry(entry("RAIL_NAME=%s", a)){};
    type _entry;
};
struct RAW_STATUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAW_STATUS";
    using type =
        std::tuple<std::decay_t<decltype("RAW_STATUS=%s")>, const char*>;
    explicit constexpr RAW_STATUS(const char* a) :
        _entry(entry("RAW_STATUS=%s", a)){};
    type _entry;
};
} // namespace _PowerSequencerVoltageFault

struct PowerSequencerVoltageFault
{
    static constexpr auto L = level::ERR;
    using RAIL = _PowerSequencerVoltageFault::RAIL;
    using RAIL_NAME = _PowerSequencerVoltageFault::RAIL_NAME;
    using RAW_STATUS = _PowerSequencerVoltageFault::RAW_STATUS;
    using metadata_types = std::tuple<RAIL, RAIL_NAME, RAW_STATUS>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using PowerSequencerVoltageFault = phosphor::logging::org::open_power::
    witherspoon::fault::PowerSequencerVoltageFault;
}
#endif

namespace details
{

template <>
struct map_exception_type<sdbusplus::error::org::open_power::witherspoon::
                              fault::PowerSequencerVoltageFault>
{
    using type = phosphor::logging::org::open_power::witherspoon::fault::
        PowerSequencerVoltageFault;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{
namespace _PowerSequencerPGOODFault
{
struct INPUT_NUM
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "INPUT_NUM";
    using type = std::tuple<std::decay_t<decltype("INPUT_NUM=%d")>, uint16_t>;
    explicit constexpr INPUT_NUM(uint16_t a) :
        _entry(entry("INPUT_NUM=%d", a)){};
    type _entry;
};
struct INPUT_NAME
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "INPUT_NAME";
    using type =
        std::tuple<std::decay_t<decltype("INPUT_NAME=%s")>, const char*>;
    explicit constexpr INPUT_NAME(const char* a) :
        _entry(entry("INPUT_NAME=%s", a)){};
    type _entry;
};
struct RAW_STATUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAW_STATUS";
    using type =
        std::tuple<std::decay_t<decltype("RAW_STATUS=%s")>, const char*>;
    explicit constexpr RAW_STATUS(const char* a) :
        _entry(entry("RAW_STATUS=%s", a)){};
    type _entry;
};
} // namespace _PowerSequencerPGOODFault

struct PowerSequencerPGOODFault
{
    static constexpr auto L = level::ERR;
    using INPUT_NUM = _PowerSequencerPGOODFault::INPUT_NUM;
    using INPUT_NAME = _PowerSequencerPGOODFault::INPUT_NAME;
    using RAW_STATUS = _PowerSequencerPGOODFault::RAW_STATUS;
    using metadata_types = std::tuple<INPUT_NUM, INPUT_NAME, RAW_STATUS>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using PowerSequencerPGOODFault = phosphor::logging::org::open_power::
    witherspoon::fault::PowerSequencerPGOODFault;
}
#endif

namespace details
{

template <>
struct map_exception_type<sdbusplus::error::org::open_power::witherspoon::
                              fault::PowerSequencerPGOODFault>
{
    using type = phosphor::logging::org::open_power::witherspoon::fault::
        PowerSequencerPGOODFault;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{
namespace _PowerSequencerFault
{
struct RAW_STATUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAW_STATUS";
    using type =
        std::tuple<std::decay_t<decltype("RAW_STATUS=%s")>, const char*>;
    explicit constexpr RAW_STATUS(const char* a) :
        _entry(entry("RAW_STATUS=%s", a)){};
    type _entry;
};
} // namespace _PowerSequencerFault

struct PowerSequencerFault
{
    static constexpr auto L = level::ERR;
    using RAW_STATUS = _PowerSequencerFault::RAW_STATUS;
    using metadata_types = std::tuple<RAW_STATUS>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using PowerSequencerFault =
    phosphor::logging::org::open_power::witherspoon::fault::PowerSequencerFault;
}
#endif

namespace details
{

template <>
struct map_exception_type<
    sdbusplus::error::org::open_power::witherspoon::fault::PowerSequencerFault>
{
    using type = phosphor::logging::org::open_power::witherspoon::fault::
        PowerSequencerFault;
};

} // namespace details
namespace xyz::openbmc_project::common::callout
{
namespace _Device
{
struct CALLOUT_ERRNO
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "CALLOUT_ERRNO";
    using type =
        std::tuple<std::decay_t<decltype("CALLOUT_ERRNO=%d")>, int32_t>;
    explicit constexpr CALLOUT_ERRNO(int32_t a) :
        _entry(entry("CALLOUT_ERRNO=%d", a)){};
    type _entry;
};
struct CALLOUT_DEVICE_PATH
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "CALLOUT_DEVICE_PATH";
    using type = std::tuple<std::decay_t<decltype("CALLOUT_DEVICE_PATH=%s")>,
                            const char*>;
    explicit constexpr CALLOUT_DEVICE_PATH(const char* a) :
        _entry(entry("CALLOUT_DEVICE_PATH=%s", a)){};
    type _entry;
};
} // namespace _Device

struct Device
{
    static constexpr auto L = level::ERR;
    using CALLOUT_ERRNO = _Device::CALLOUT_ERRNO;
    using CALLOUT_DEVICE_PATH = _Device::CALLOUT_DEVICE_PATH;
    using metadata_types = std::tuple<CALLOUT_ERRNO, CALLOUT_DEVICE_PATH>;
};

} // namespace xyz::openbmc_project::common::callout

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace xyz::openbmc_project::Common::Callout
{
using Device = phosphor::logging::xyz::openbmc_project::common::callout::Device;
}
#endif

namespace details
{

template <>
struct map_exception_type<
    sdbusplus::error::xyz::openbmc_project::common::callout::Device>
{
    using type =
        phosphor::logging::xyz::openbmc_project::common::callout::Device;
};

} // namespace details
namespace xyz::openbmc_project::common::callout
{
namespace _GPIO
{
struct CALLOUT_GPIO_NUM
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "CALLOUT_GPIO_NUM";
    using type =
        std::tuple<std::decay_t<decltype("CALLOUT_GPIO_NUM=%u")>, uint32_t>;
    explicit constexpr CALLOUT_GPIO_NUM(uint32_t a) :
        _entry(entry("CALLOUT_GPIO_NUM=%u", a)){};
    type _entry;
};
} // namespace _GPIO

struct GPIO
{
    static constexpr auto L = level::ERR;
    using CALLOUT_GPIO_NUM = _GPIO::CALLOUT_GPIO_NUM;
    using CALLOUT_ERRNO = phosphor::logging::xyz::openbmc_project::common::
        callout::Device::CALLOUT_ERRNO;
    using CALLOUT_DEVICE_PATH = phosphor::logging::xyz::openbmc_project::
        common::callout::Device::CALLOUT_DEVICE_PATH;
    using metadata_types =
        std::tuple<CALLOUT_GPIO_NUM, CALLOUT_ERRNO, CALLOUT_DEVICE_PATH>;
};

} // namespace xyz::openbmc_project::common::callout

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace xyz::openbmc_project::Common::Callout
{
using GPIO = phosphor::logging::xyz::openbmc_project::common::callout::GPIO;
}
#endif

namespace details
{

template <>
struct map_exception_type<
    sdbusplus::error::xyz::openbmc_project::common::callout::GPIO>
{
    using type = phosphor::logging::xyz::openbmc_project::common::callout::GPIO;
};

} // namespace details
namespace xyz::openbmc_project::common::callout
{
namespace _IIC
{
struct CALLOUT_IIC_BUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "CALLOUT_IIC_BUS";
    using type =
        std::tuple<std::decay_t<decltype("CALLOUT_IIC_BUS=%s")>, const char*>;
    explicit constexpr CALLOUT_IIC_BUS(const char* a) :
        _entry(entry("CALLOUT_IIC_BUS=%s", a)){};
    type _entry;
};
struct CALLOUT_IIC_ADDR
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "CALLOUT_IIC_ADDR";
    using type =
        std::tuple<std::decay_t<decltype("CALLOUT_IIC_ADDR=0x%hx")>, uint16_t>;
    explicit constexpr CALLOUT_IIC_ADDR(uint16_t a) :
        _entry(entry("CALLOUT_IIC_ADDR=0x%hx", a)){};
    type _entry;
};
} // namespace _IIC

struct IIC
{
    static constexpr auto L = level::ERR;
    using CALLOUT_IIC_BUS = _IIC::CALLOUT_IIC_BUS;
    using CALLOUT_IIC_ADDR = _IIC::CALLOUT_IIC_ADDR;
    using CALLOUT_ERRNO = phosphor::logging::xyz::openbmc_project::common::
        callout::Device::CALLOUT_ERRNO;
    using CALLOUT_DEVICE_PATH = phosphor::logging::xyz::openbmc_project::
        common::callout::Device::CALLOUT_DEVICE_PATH;
    using metadata_types = std::tuple<CALLOUT_IIC_BUS, CALLOUT_IIC_ADDR,
                                      CALLOUT_ERRNO, CALLOUT_DEVICE_PATH>;
};

} // namespace xyz::openbmc_project::common::callout

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace xyz::openbmc_project::Common::Callout
{
using IIC = phosphor::logging::xyz::openbmc_project::common::callout::IIC;
}
#endif

namespace details
{

template <>
struct map_exception_type<
    sdbusplus::error::xyz::openbmc_project::common::callout::IIC>
{
    using type = phosphor::logging::xyz::openbmc_project::common::callout::IIC;
};

} // namespace details
namespace xyz::openbmc_project::common::callout
{
namespace _Inventory
{
struct CALLOUT_INVENTORY_PATH
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "CALLOUT_INVENTORY_PATH";
    using type = std::tuple<std::decay_t<decltype("CALLOUT_INVENTORY_PATH=%s")>,
                            const char*>;
    explicit constexpr CALLOUT_INVENTORY_PATH(const char* a) :
        _entry(entry("CALLOUT_INVENTORY_PATH=%s", a)){};
    type _entry;
};
} // namespace _Inventory

struct Inventory
{
    static constexpr auto L = level::ERR;
    using CALLOUT_INVENTORY_PATH = _Inventory::CALLOUT_INVENTORY_PATH;
    using metadata_types = std::tuple<CALLOUT_INVENTORY_PATH>;
};

} // namespace xyz::openbmc_project::common::callout

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace xyz::openbmc_project::Common::Callout
{
using Inventory =
    phosphor::logging::xyz::openbmc_project::common::callout::Inventory;
}
#endif

namespace details
{

template <>
struct map_exception_type<
    sdbusplus::error::xyz::openbmc_project::common::callout::Inventory>
{
    using type =
        phosphor::logging::xyz::openbmc_project::common::callout::Inventory;
};

} // namespace details
namespace xyz::openbmc_project::common::callout
{
namespace _IPMISensor
{
struct CALLOUT_IPMI_SENSOR_NUM
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "CALLOUT_IPMI_SENSOR_NUM";
    using type =
        std::tuple<std::decay_t<decltype("CALLOUT_IPMI_SENSOR_NUM=%u")>,
                   uint32_t>;
    explicit constexpr CALLOUT_IPMI_SENSOR_NUM(uint32_t a) :
        _entry(entry("CALLOUT_IPMI_SENSOR_NUM=%u", a)){};
    type _entry;
};
} // namespace _IPMISensor

struct IPMISensor
{
    static constexpr auto L = level::ERR;
    using CALLOUT_IPMI_SENSOR_NUM = _IPMISensor::CALLOUT_IPMI_SENSOR_NUM;
    using metadata_types = std::tuple<CALLOUT_IPMI_SENSOR_NUM>;
};

} // namespace xyz::openbmc_project::common::callout

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace xyz::openbmc_project::Common::Callout
{
using IPMISensor =
    phosphor::logging::xyz::openbmc_project::common::callout::IPMISensor;
}
#endif

namespace details
{

template <>
struct map_exception_type<
    sdbusplus::error::xyz::openbmc_project::common::callout::IPMISensor>
{
    using type =
        phosphor::logging::xyz::openbmc_project::common::callout::IPMISensor;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{
namespace _PowerSupplyInputFault
{
struct RAW_STATUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAW_STATUS";
    using type =
        std::tuple<std::decay_t<decltype("RAW_STATUS=%s")>, const char*>;
    explicit constexpr RAW_STATUS(const char* a) :
        _entry(entry("RAW_STATUS=%s", a)){};
    type _entry;
};
} // namespace _PowerSupplyInputFault

struct PowerSupplyInputFault
{
    static constexpr auto L = level::ERR;
    using RAW_STATUS = _PowerSupplyInputFault::RAW_STATUS;
    using CALLOUT_INVENTORY_PATH = phosphor::logging::xyz::openbmc_project::
        common::callout::Inventory::CALLOUT_INVENTORY_PATH;
    using metadata_types = std::tuple<RAW_STATUS, CALLOUT_INVENTORY_PATH>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using PowerSupplyInputFault = phosphor::logging::org::open_power::witherspoon::
    fault::PowerSupplyInputFault;
}
#endif

namespace details
{

template <>
struct map_exception_type<sdbusplus::error::org::open_power::witherspoon::
                              fault::PowerSupplyInputFault>
{
    using type = phosphor::logging::org::open_power::witherspoon::fault::
        PowerSupplyInputFault;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{
namespace _PowerSupplyShouldBeOn
{
struct RAW_STATUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAW_STATUS";
    using type =
        std::tuple<std::decay_t<decltype("RAW_STATUS=%s")>, const char*>;
    explicit constexpr RAW_STATUS(const char* a) :
        _entry(entry("RAW_STATUS=%s", a)){};
    type _entry;
};
} // namespace _PowerSupplyShouldBeOn

struct PowerSupplyShouldBeOn
{
    static constexpr auto L = level::ERR;
    using RAW_STATUS = _PowerSupplyShouldBeOn::RAW_STATUS;
    using CALLOUT_INVENTORY_PATH = phosphor::logging::xyz::openbmc_project::
        common::callout::Inventory::CALLOUT_INVENTORY_PATH;
    using metadata_types = std::tuple<RAW_STATUS, CALLOUT_INVENTORY_PATH>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using PowerSupplyShouldBeOn = phosphor::logging::org::open_power::witherspoon::
    fault::PowerSupplyShouldBeOn;
}
#endif

namespace details
{

template <>
struct map_exception_type<sdbusplus::error::org::open_power::witherspoon::
                              fault::PowerSupplyShouldBeOn>
{
    using type = phosphor::logging::org::open_power::witherspoon::fault::
        PowerSupplyShouldBeOn;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{
namespace _PowerSupplyOutputOvercurrent
{
struct RAW_STATUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAW_STATUS";
    using type =
        std::tuple<std::decay_t<decltype("RAW_STATUS=%s")>, const char*>;
    explicit constexpr RAW_STATUS(const char* a) :
        _entry(entry("RAW_STATUS=%s", a)){};
    type _entry;
};
} // namespace _PowerSupplyOutputOvercurrent

struct PowerSupplyOutputOvercurrent
{
    static constexpr auto L = level::ERR;
    using RAW_STATUS = _PowerSupplyOutputOvercurrent::RAW_STATUS;
    using CALLOUT_INVENTORY_PATH = phosphor::logging::xyz::openbmc_project::
        common::callout::Inventory::CALLOUT_INVENTORY_PATH;
    using metadata_types = std::tuple<RAW_STATUS, CALLOUT_INVENTORY_PATH>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using PowerSupplyOutputOvercurrent = phosphor::logging::org::open_power::
    witherspoon::fault::PowerSupplyOutputOvercurrent;
}
#endif

namespace details
{

template <>
struct map_exception_type<sdbusplus::error::org::open_power::witherspoon::
                              fault::PowerSupplyOutputOvercurrent>
{
    using type = phosphor::logging::org::open_power::witherspoon::fault::
        PowerSupplyOutputOvercurrent;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{
namespace _PowerSupplyOutputOvervoltage
{
struct RAW_STATUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAW_STATUS";
    using type =
        std::tuple<std::decay_t<decltype("RAW_STATUS=%s")>, const char*>;
    explicit constexpr RAW_STATUS(const char* a) :
        _entry(entry("RAW_STATUS=%s", a)){};
    type _entry;
};
} // namespace _PowerSupplyOutputOvervoltage

struct PowerSupplyOutputOvervoltage
{
    static constexpr auto L = level::ERR;
    using RAW_STATUS = _PowerSupplyOutputOvervoltage::RAW_STATUS;
    using CALLOUT_INVENTORY_PATH = phosphor::logging::xyz::openbmc_project::
        common::callout::Inventory::CALLOUT_INVENTORY_PATH;
    using metadata_types = std::tuple<RAW_STATUS, CALLOUT_INVENTORY_PATH>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using PowerSupplyOutputOvervoltage = phosphor::logging::org::open_power::
    witherspoon::fault::PowerSupplyOutputOvervoltage;
}
#endif

namespace details
{

template <>
struct map_exception_type<sdbusplus::error::org::open_power::witherspoon::
                              fault::PowerSupplyOutputOvervoltage>
{
    using type = phosphor::logging::org::open_power::witherspoon::fault::
        PowerSupplyOutputOvervoltage;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{
namespace _PowerSupplyFanFault
{
struct RAW_STATUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAW_STATUS";
    using type =
        std::tuple<std::decay_t<decltype("RAW_STATUS=%s")>, const char*>;
    explicit constexpr RAW_STATUS(const char* a) :
        _entry(entry("RAW_STATUS=%s", a)){};
    type _entry;
};
} // namespace _PowerSupplyFanFault

struct PowerSupplyFanFault
{
    static constexpr auto L = level::ERR;
    using RAW_STATUS = _PowerSupplyFanFault::RAW_STATUS;
    using CALLOUT_INVENTORY_PATH = phosphor::logging::xyz::openbmc_project::
        common::callout::Inventory::CALLOUT_INVENTORY_PATH;
    using metadata_types = std::tuple<RAW_STATUS, CALLOUT_INVENTORY_PATH>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using PowerSupplyFanFault =
    phosphor::logging::org::open_power::witherspoon::fault::PowerSupplyFanFault;
}
#endif

namespace details
{

template <>
struct map_exception_type<
    sdbusplus::error::org::open_power::witherspoon::fault::PowerSupplyFanFault>
{
    using type = phosphor::logging::org::open_power::witherspoon::fault::
        PowerSupplyFanFault;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{
namespace _PowerSupplyTemperatureFault
{
struct RAW_STATUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAW_STATUS";
    using type =
        std::tuple<std::decay_t<decltype("RAW_STATUS=%s")>, const char*>;
    explicit constexpr RAW_STATUS(const char* a) :
        _entry(entry("RAW_STATUS=%s", a)){};
    type _entry;
};
} // namespace _PowerSupplyTemperatureFault

struct PowerSupplyTemperatureFault
{
    static constexpr auto L = level::ERR;
    using RAW_STATUS = _PowerSupplyTemperatureFault::RAW_STATUS;
    using CALLOUT_INVENTORY_PATH = phosphor::logging::xyz::openbmc_project::
        common::callout::Inventory::CALLOUT_INVENTORY_PATH;
    using metadata_types = std::tuple<RAW_STATUS, CALLOUT_INVENTORY_PATH>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using PowerSupplyTemperatureFault = phosphor::logging::org::open_power::
    witherspoon::fault::PowerSupplyTemperatureFault;
}
#endif

namespace details
{

template <>
struct map_exception_type<sdbusplus::error::org::open_power::witherspoon::
                              fault::PowerSupplyTemperatureFault>
{
    using type = phosphor::logging::org::open_power::witherspoon::fault::
        PowerSupplyTemperatureFault;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{
namespace _GPUPowerFault
{
struct RAW_STATUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAW_STATUS";
    using type =
        std::tuple<std::decay_t<decltype("RAW_STATUS=%s")>, const char*>;
    explicit constexpr RAW_STATUS(const char* a) :
        _entry(entry("RAW_STATUS=%s", a)){};
    type _entry;
};
} // namespace _GPUPowerFault

struct GPUPowerFault
{
    static constexpr auto L = level::ERR;
    using RAW_STATUS = _GPUPowerFault::RAW_STATUS;
    using CALLOUT_INVENTORY_PATH = phosphor::logging::xyz::openbmc_project::
        common::callout::Inventory::CALLOUT_INVENTORY_PATH;
    using metadata_types = std::tuple<RAW_STATUS, CALLOUT_INVENTORY_PATH>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using GPUPowerFault =
    phosphor::logging::org::open_power::witherspoon::fault::GPUPowerFault;
}
#endif

namespace details
{

template <>
struct map_exception_type<
    sdbusplus::error::org::open_power::witherspoon::fault::GPUPowerFault>
{
    using type =
        phosphor::logging::org::open_power::witherspoon::fault::GPUPowerFault;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{
namespace _GPUOverTemp
{
struct RAW_STATUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAW_STATUS";
    using type =
        std::tuple<std::decay_t<decltype("RAW_STATUS=%s")>, const char*>;
    explicit constexpr RAW_STATUS(const char* a) :
        _entry(entry("RAW_STATUS=%s", a)){};
    type _entry;
};
} // namespace _GPUOverTemp

struct GPUOverTemp
{
    static constexpr auto L = level::ERR;
    using RAW_STATUS = _GPUOverTemp::RAW_STATUS;
    using CALLOUT_INVENTORY_PATH = phosphor::logging::xyz::openbmc_project::
        common::callout::Inventory::CALLOUT_INVENTORY_PATH;
    using metadata_types = std::tuple<RAW_STATUS, CALLOUT_INVENTORY_PATH>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using GPUOverTemp =
    phosphor::logging::org::open_power::witherspoon::fault::GPUOverTemp;
}
#endif

namespace details
{

template <>
struct map_exception_type<
    sdbusplus::error::org::open_power::witherspoon::fault::GPUOverTemp>
{
    using type =
        phosphor::logging::org::open_power::witherspoon::fault::GPUOverTemp;
};

} // namespace details
namespace org::open_power::witherspoon::fault
{
namespace _MemoryPowerFault
{
struct RAW_STATUS
{
    /*
     * We can't use -fsanitize=undefined if we declare a
     * 'static constexpr auto str' member, so don't. Instead, open-code the
     * mako template lookups.
     */
    static constexpr auto str_short = "RAW_STATUS";
    using type =
        std::tuple<std::decay_t<decltype("RAW_STATUS=%s")>, const char*>;
    explicit constexpr RAW_STATUS(const char* a) :
        _entry(entry("RAW_STATUS=%s", a)){};
    type _entry;
};
} // namespace _MemoryPowerFault

struct MemoryPowerFault
{
    static constexpr auto L = level::ERR;
    using RAW_STATUS = _MemoryPowerFault::RAW_STATUS;
    using CALLOUT_INVENTORY_PATH = phosphor::logging::xyz::openbmc_project::
        common::callout::Inventory::CALLOUT_INVENTORY_PATH;
    using metadata_types = std::tuple<RAW_STATUS, CALLOUT_INVENTORY_PATH>;
};

} // namespace org::open_power::witherspoon::fault

#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
namespace org::open_power::Witherspoon::Fault
{
using MemoryPowerFault =
    phosphor::logging::org::open_power::witherspoon::fault::MemoryPowerFault;
}
#endif

namespace details
{

template <>
struct map_exception_type<
    sdbusplus::error::org::open_power::witherspoon::fault::MemoryPowerFault>
{
    using type = phosphor::logging::org::open_power::witherspoon::fault::
        MemoryPowerFault;
};

} // namespace details
} // namespace phosphor::logging
