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