// this file is included into struct Parser
// ! no namespaces or #includes here !

struct FrameSender {
    FrameSender (FrameSender&& other) : _parser(other._parser) {}
    FrameSender (FrameSender&) = delete;

    string send (IsFinal final = IsFinal::NO)                      { return _parser.send_frame(final); }
    string send (string_view payload, IsFinal final = IsFinal::NO) { return _parser.send_frame(payload, final); }

    template <class B, class E, class T = decltype(*std::declval<B>()), class = std::enable_if_t<std::is_convertible<T, string_view>::value>>
    string send (B&& payload_begin, E&& payload_end, IsFinal final = IsFinal::NO) {
        return _parser.send_frame(std::forward<B>(payload_begin), std::forward<E>(payload_end), final);
    }

protected:
    FrameSender (Parser& parser) : _parser(parser) {}

    Parser& _parser;

private:
    friend Parser;
};