#pragma once #include #include #include struct irctag { std::string_view key; std::string_view val; irctag(std::string_view key, std::string_view val) : key{key} , val{val} { } friend auto operator==(const irctag &, const irctag &) -> bool = default; }; struct IrcMsg { std::vector tags; std::vector args; std::string_view source; std::string_view command; IrcMsg() = default; IrcMsg( std::vector &&tags, std::string_view source, std::string_view command, std::vector &&args ) : tags(std::move(tags)) , args(std::move(args)) , source{source} , command{command} { } bool hassource() const; friend bool operator==(const IrcMsg &, const IrcMsg &) = default; }; enum class irc_error_code { MISSING_TAG, MISSING_COMMAND, }; auto operator<<(std::ostream &out, irc_error_code) -> std::ostream &; struct irc_parse_error : public std::exception { irc_error_code code; irc_parse_error(irc_error_code code) : code(code) { } }; /** * Parses the given IRC message into a structured format. * The original message is mangled to store string fragments * that are pointed to by the structured message type. * * Returns zero for success, non-zero for parse error. */ auto parse_irc_message(char *msg) -> IrcMsg; auto parse_irc_tags(char *msg) -> std::vector;