// 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 ErrorCode0;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode1;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode10;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode11;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode12;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode13;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode14;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode15;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode16;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode17;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode18;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode19;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode2;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode20;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode21;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode22;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode23;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode24;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode25;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode26;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode27;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode28;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode29;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode3;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode30;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode31;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode32;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode33;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode34;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode35;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode36;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode4;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode5;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode6;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode7;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode8;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
namespace sdbusplus::error::org::open_power::witherspoon::fault
{
struct ErrorCode9;
} // namespace sdbusplus::error::org::open_power::witherspoon::fault
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
{

struct ErrorCode0
{
    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 ErrorCode0 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode0;
}
#endif

namespace details
{

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

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

struct ErrorCode1
{
    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 ErrorCode1 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode1;
}
#endif

namespace details
{

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

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

struct ErrorCode2
{
    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 ErrorCode2 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode2;
}
#endif

namespace details
{

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

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

struct ErrorCode3
{
    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 ErrorCode3 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode3;
}
#endif

namespace details
{

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

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

struct ErrorCode4
{
    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 ErrorCode4 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode4;
}
#endif

namespace details
{

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

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

struct ErrorCode5
{
    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 ErrorCode5 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode5;
}
#endif

namespace details
{

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

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

struct ErrorCode6
{
    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 ErrorCode6 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode6;
}
#endif

namespace details
{

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

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

struct ErrorCode7
{
    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 ErrorCode7 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode7;
}
#endif

namespace details
{

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

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

struct ErrorCode8
{
    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 ErrorCode8 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode8;
}
#endif

namespace details
{

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

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

struct ErrorCode9
{
    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 ErrorCode9 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode9;
}
#endif

namespace details
{

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

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

struct ErrorCode10
{
    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 ErrorCode10 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode10;
}
#endif

namespace details
{

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

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

struct ErrorCode11
{
    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 ErrorCode11 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode11;
}
#endif

namespace details
{

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

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

struct ErrorCode12
{
    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 ErrorCode12 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode12;
}
#endif

namespace details
{

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

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

struct ErrorCode13
{
    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 ErrorCode13 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode13;
}
#endif

namespace details
{

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

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

struct ErrorCode14
{
    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 ErrorCode14 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode14;
}
#endif

namespace details
{

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

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

struct ErrorCode15
{
    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 ErrorCode15 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode15;
}
#endif

namespace details
{

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

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

struct ErrorCode16
{
    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 ErrorCode16 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode16;
}
#endif

namespace details
{

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

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

struct ErrorCode17
{
    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 ErrorCode17 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode17;
}
#endif

namespace details
{

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

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

struct ErrorCode18
{
    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 ErrorCode18 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode18;
}
#endif

namespace details
{

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

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

struct ErrorCode19
{
    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 ErrorCode19 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode19;
}
#endif

namespace details
{

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

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

struct ErrorCode20
{
    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 ErrorCode20 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode20;
}
#endif

namespace details
{

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

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

struct ErrorCode21
{
    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 ErrorCode21 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode21;
}
#endif

namespace details
{

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

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

struct ErrorCode22
{
    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 ErrorCode22 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode22;
}
#endif

namespace details
{

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

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

struct ErrorCode23
{
    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 ErrorCode23 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode23;
}
#endif

namespace details
{

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

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

struct ErrorCode24
{
    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 ErrorCode24 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode24;
}
#endif

namespace details
{

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

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

struct ErrorCode25
{
    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 ErrorCode25 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode25;
}
#endif

namespace details
{

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

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

struct ErrorCode26
{
    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 ErrorCode26 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode26;
}
#endif

namespace details
{

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

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

struct ErrorCode27
{
    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 ErrorCode27 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode27;
}
#endif

namespace details
{

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

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

struct ErrorCode28
{
    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 ErrorCode28 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode28;
}
#endif

namespace details
{

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

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

struct ErrorCode29
{
    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 ErrorCode29 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode29;
}
#endif

namespace details
{

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

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

struct ErrorCode30
{
    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 ErrorCode30 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode30;
}
#endif

namespace details
{

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

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

struct ErrorCode31
{
    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 ErrorCode31 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode31;
}
#endif

namespace details
{

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

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

struct ErrorCode32
{
    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 ErrorCode32 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode32;
}
#endif

namespace details
{

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

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

struct ErrorCode33
{
    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 ErrorCode33 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode33;
}
#endif

namespace details
{

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

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

struct ErrorCode34
{
    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 ErrorCode34 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode34;
}
#endif

namespace details
{

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

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

struct ErrorCode35
{
    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 ErrorCode35 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode35;
}
#endif

namespace details
{

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

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

struct ErrorCode36
{
    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 ErrorCode36 =
    phosphor::logging::org::open_power::witherspoon::fault::ErrorCode36;
}
#endif

namespace details
{

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

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