module socks.client.vibe;

version(SocksClientDriverVibed):

pragma(msg, "Using vibed driver for socks-client");

public import socks.socks5;
import core.time;
import vibe.core.net;
import vibe.core.log;

TCPConnection connectTCPSocks(S)(S socksOptions, string host, ushort port, string bind_interface = null,
    ushort bind_port = 0, Duration timeout = Duration.max)
    if (isSocksOptions!S)
{
    TCPConnection conn;

    SocksTCPConnector connector = (in string host, in ushort port)
    {
        conn = connectTCP(socksOptions.host, socksOptions.port, bind_interface, bind_port, timeout);

        return true;
    };
    SocksDataReader reader = (ubyte[] data) {
        conn.read(data);
    };
    SocksDataWriter writer = (in ubyte[] data) { conn.write(data); };
    SocksHostnameResolver resolver = (in string hostname) {
        NetworkAddress address = resolveHost(hostname, AddressFamily.UNSPEC, true);

        return address.toAddressString();
    };

    auto socks5 = Socks5(reader, writer, connector, resolver);

    socks5.connect(socksOptions, host, port);

    logWarn("Connected");

    return conn;
}