BareGit
#include "service.h"

namespace
{

struct ProbeFactory
{
    std::chrono::seconds timeout;
    const std::optional<std::string>& url;

    mw::E<std::unique_ptr<ProbeInterface>> operator()(
        const HttpEndpoint& endpoint) const
    {
        if(endpoint.url.empty() && url)
        {
            return ::createProbe(HttpEndpoint{*url}, timeout);
        }
        return ::createProbe(endpoint, timeout);
    }

    template<typename Endpoint>
    mw::E<std::unique_ptr<ProbeInterface>> operator()(
        const Endpoint& endpoint) const
    {
        return ::createProbe(endpoint, timeout);
    }
};

}

mw::E<std::unique_ptr<ProbeInterface>> Service::createProbe() const
{
    return std::visit(ProbeFactory{config.timeout, config.url},
                      config.endpoint);
}