#pragma once
#include <ableton/discovery/AsioTypes.hpp>
#include <ableton/util/Log.hpp>
#include <functional>
#include <utility>
#include <vector>
namespace ableton
{
namespace discovery
{
namespace test
{
class Interface
{
public:
Interface() = default;
Interface(UdpEndpoint endpoint)
: mEndpoint(std::move(endpoint))
{
}
void send(const uint8_t* const bytes,
const size_t numBytes,
const UdpEndpoint& endpoint)
{
sentMessages.push_back(
std::make_pair(std::vector<uint8_t>{bytes, bytes + numBytes}, endpoint));
}
template <typename Callback, typename Tag>
void receive(Callback callback, Tag tag)
{
mCallback = [callback, tag](
const UdpEndpoint& from, const std::vector<uint8_t>& buffer)
{ callback(tag, from, begin(buffer), end(buffer)); };
}
template <typename Callback>
void receive(Callback callback)
{
mCallback = [callback](const auto& from, const auto& buffer)
{ callback(from, begin(buffer), end(buffer)); };
}
template <typename It>
void incomingMessage(const UdpEndpoint& from, It messageBegin, It messageEnd)
{
std::vector<uint8_t> buffer{messageBegin, messageEnd};
mCallback(from, buffer);
}
UdpEndpoint endpoint() const { return mEndpoint; }
using SentMessage = std::pair<std::vector<uint8_t>, UdpEndpoint>;
std::vector<SentMessage> sentMessages;
private:
using ReceiveCallback =
std::function<void(const UdpEndpoint&, const std::vector<uint8_t>&)>;
ReceiveCallback mCallback;
UdpEndpoint mEndpoint;
};
} } }