// 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
