#include "config.h"
#include "elog_meta.hpp"

namespace phosphor
{
namespace logging
{
namespace metadata
{
namespace associations
{

#if defined PROCESS_META

template <>
void build<xyz::openbmc_project::Common::
           Callout::Device::CALLOUT_DEVICE_PATH>(
    const std::string& match,
    const std::vector<std::string>& data,
    AssociationList& list)
{
    std::map<std::string, std::string> metadata;
    parse(data, metadata);
    auto iter = metadata.find(match);
    if(metadata.end() != iter)
    {
        auto comp = [](const auto& first, const auto& second)
        {
            return (strcmp(std::get<0>(first), second) < 0);
        };
        auto callout = std::lower_bound(callouts.begin(),
                                        callouts.end(),
                                        (iter->second).c_str(),
                                        comp);
        if((callouts.end() != callout) &&
           !strcmp((iter->second).c_str(), std::get<0>(*callout)))
        {
            list.emplace_back(std::make_tuple(CALLOUT_FWD_ASSOCIATION,
                                              CALLOUT_REV_ASSOCIATION,
                                              std::string(INVENTORY_ROOT) +
                                              std::get<1>(*callout)));
        }
    }
}

#endif

} // namespace associations
} // namespace metadata
} // namespace logging
} // namespace phosphor
