#include "irc/parse_caps.hpp" const std::unordered_map> parse_caps(const std::string &caps) { std::unordered_map> output; // caps => multi-prefix sasl=PLAIN,EXTERNAL // draft/multiline=max-bytes=40000,max-lines=10 const std::vector &caps_list = utils::split(caps, ' ', false); for (const std::string &cap : caps_list) { // cap => multi-prefix // cap => sasl=PLAIN,EXTERNAL // cap => draft/multiline=max-bytes=40000,max-lines=10 const size_t delimiter = cap.find("="); // delimiter(multi-prefix) => npos // delimiter(sasl=PLAIN,EXTERNAL) => 5 // delimiter(draft/multiline=max-bytes=40000,max-lines=10) => 16 const std::string cap_name = cap.substr(0, delimiter); std::optional cap_value; if (delimiter != std::string::npos) cap_value = cap.substr(delimiter + 1); output.insert_or_assign(cap_name, cap_value); } return output; } const std::vector parse_cap_val_list(const std::string &value) { // value(PLAIN,EXTERNAL) => PLAIN,EXTERNAL return utils::split(value, ',', false); } const std::unordered_map> parse_cap_keyval(const std::string &value) { std::unordered_map> output; // value(PLAIN,EXTERNAL) => PLAIN,EXTERNAL // value(max-bytes=40000,max-lines=10) => // max-bytes=40000,max-lines=10 const std::vector &values_list = utils::split(value, ',', false); // values_list(PLAIN,EXTERNAL) => { "PLAIN", "EXTERNAL" } // values_list(draft/multiline=max-bytes=40000,max-lines=10) => { // "max-bytes=40000", "max-lines=10" } for (const std::string &value : values_list) { const size_t value_delimiter = value.find("="); // key(PLAIN) => PLAIN // key(max-bytes=40000) => max-bytes const std::string key = value.substr(0, value_delimiter); std::optional val; if (value_delimiter != std::string::npos) { // val(max-bytes=40000) => 40000 val = value.substr(value_delimiter + 1); } output.insert_or_assign(key, val); } return output; }